def fixed_shuffle(lst):
unfrozen_indices, unfrozen_subset = zip(*[(i, e) for i, e in enumerate(lst)
if not e.freeze])
unfrozen_indices = list(unfrozen_indices)
random.shuffle(unfrozen_indices)
for i, e in zip(unfrozen_indices, unfrozen_subset):
lst[i] = e
# memorize position of fixed elements
fixed = [(pos, item) for (pos,item) in enumerate(items) if item.freeze]
# shuffle list
random.shuffle(items)
# swap fixed elements back to their original position
for pos, item in fixed:
index = items.index(item)
items[pos], items[index] = items[index], items[pos]
from random import random
def shuffle_with_freeze(x):
for i in reversed(xrange(1, len(x))):
if x[i].freeze: continue # fixed
# pick an element in x[:i+1] with which to exchange x[i]
j = int(random() * (i+1))
if x[j].freeze: continue #NOTE: it might make it less random
x[i], x[j] = x[j], x[i] # swap
一种解决方案:
注意:如果
^{pr2}$lst
是一个numpy array而不是一个常规列表,则这可能会更简单一些:其用法示例:
另一种解决方案:
在线性时间中,常数空间使用^{} :
相关问题 更多 >
编程相关推荐