あなたが求めているものよりも少し一般的なアプローチを実装しようとすることは、興味深く、教育的であると思いました. ここでは、ロックされたインデックスを除外して、インデックスを (リスト自体ではなく) 元のリストにシャッフルし、そのインデックスリストを使用して元のリストから要素を選択します。これはインプレース ソリューションではありませんが、要素を遅延選択できるようにジェネレーターとして実装されています。
改善できる場合は自由に編集してください。
import random
def partial_shuf(input_list, fixed_indices):
"""Given an input_list, yield elements from that list in random order
except where elements indices are in fixed_indices."""
fixed_indices = sorted(set(i for i in fixed_indices if i < len(input_list)))
i = 0
for fixed in fixed_indices:
aslice = range(i, fixed)
i = 1 + fixed
random.shuffle(aslice)
for j in aslice:
yield input_list[j]
yield input_list[fixed]
aslice = range(i, len(input_list))
random.shuffle(aslice)
for j in aslice:
yield input_list[j]
print '\n'.join(' '.join((str(i), str(n))) for i, n in enumerate(partial_shuf(range(4, 36), [0, 4, 9, 17, 25, 40])))
assert sorted(partial_shuf(range(4, 36), [0, 4, 9, 17, 25, 40])) == range(4, 36)