我们基本上是对索引进行洗牌,而不是对值进行洗牌:import random
def shuffle_except(lst, keep):
# keep should be a list of the indexes that we want to keep fixed
# can also be a range or a sum of range
# keep = range(0, 2) + range(5, 8)
keep = set(keep)
start_indexes = [i for i in xrange(len(lst)) if i not in keep]
end_indexes = [i for i in xrange(len(lst)) if i not in keep]
# we shuffle end indexes
random.shuffle(end_indexes)
# for each element in start_indexes, we move the corresponding element of lst
# to its counterpart in end_indexes
for i in xrange(len(start_indexes)):
start = start_indexes[i]
end = end_indexes[i]
lst[start], lst[end] = lst[end], lst[start]
a = range(20)
print a
print a[1], a[5], a[10], a[15]
shuffle_except(a, {1, 5, 10, 15})
print a
print a[1], a[5], a[10], a[15]
印刷品:
^{pr2}$
如您所见,除了我们指定的元素外,所有元素现在都被无序排列。在
现在,如果您还想分组多个洗牌,下面是一个示例:multi_list = [range(10) for _ in xrange(5)]
keep = {0, 3, 5}
for lst in multi_list:
shuffle_except(lst, keep)
print multi_list
结果如下:[
[0, 6, 2, 3, 4, 5, 1, 7, 8, 9],
[0, 4, 2, 3, 1, 5, 7, 9, 6, 8],
[0, 1, 4, 3, 2, 5, 8, 6, 7, 9],
[0, 2, 7, 3, 1, 5, 9, 4, 6, 8],
[0, 6, 4, 3, 1, 5, 2, 9, 7, 8]
]
同样,您可以看到列0、3和5始终具有与原始列表中相同的值