我有一个list
,我想将它的一部分洗牌就地。
[我知道random.shuffle()
并可以在原地工作,但是如果我对其进行切片,它将混叠原始输入的切片副本,而使原始list
保持不变:
import random
l = list(range(20))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
random.shuffle(l[:10]) # I wish it was shuffling the first half
print(l) # but does nothing to `l`
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
我有什么选择?
不是真正就位,但具有预期的结果:
import random
l = list(range(20))
lpart = l[:10]
random.shuffle(lpart)
l[:10] = lpart
print(l)
修改列表的n位将无法按照您的操作方式进行。您可以改用random.sample
进行随机抽样而不进行替换,然后分片分配:
k = 10
l[:k] = random.sample(l[:k], k=k)
print(l)
# [1, 7, 6, 0, 2, 3, 4, 9, 8, 5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]