就地重排列表部分

问题描述 投票:0回答:2

我有一个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]

我有什么选择?

python random shuffle in-place
2个回答
3
投票

不是真正就位,但具有预期的结果:

import random

l = list(range(20))

lpart = l[:10]
random.shuffle(lpart)

l[:10] = lpart

print(l)

1
投票

修改列表的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]
© www.soinside.com 2019 - 2024. All rights reserved.