是否可以仅对给定列表(或numpy中的数组)的(连续)部分进行混洗?
如果这通常是不可能的,那么在特殊情况下,第一个元素是固定的,而列表/数组的其余部分需要打乱呢?例如,我有一个列表/数组:
to_be_shuffled = [None, 'a', 'b', 'c', 'd', ...]第一个元素应该始终留在那里,而其余的元素将重复洗牌。
一种可能的方法是首先打乱整个列表,然后检查第一个元素,如果它不是特殊的固定元素(例如None),然后将其位置与特殊元素的位置交换(这将需要查找)。
有没有更好的方法呢?
发布于 2012-07-29 12:10:25
numpy数组在切片时不复制数据:
numpy.random.shuffle(a[1:])发布于 2012-07-29 11:03:25
为什么不干脆
import random
rest = to_be_shuffled[1:]
random.shuffle(rest)
shuffled_lst = [to_be_shuffled[0]] + rest发布于 2012-07-29 12:09:27
我认为尝试实现一种比您所要求的方法更通用的方法会更有趣,也更有教育意义。在这里,我将索引混洗到原始列表(而不是列表本身),排除锁定的索引,并使用该索引列表从原始列表中挑选元素。这不是一个就地解决方案,而是作为一个生成器实现的,因此您可以懒惰地挑选元素。
如果你能改进它,请随意编辑。
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)https://stackoverflow.com/questions/11706287
复制相似问题