首页 > 解决方案 > 就地改组列表的一部分

问题描述

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

我有什么选择?


编辑:这并不是这个问题的真正副本,因为它不需要就地最终,正如其中发布的答案之一所建议的那样,似乎可以仅手动将列表的一部分就地改组(这正是我试图避免的)。

标签: pythonrandomshufflein-place

解决方案


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

import random

l = list(range(20))

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

l[:10] = lpart

print(l)

推荐阅读