我知道如何重新整理元素列表。但是,如果我想对两个特定元素之间的所有元素进行混洗,应该怎么做。
import random
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
random.shuffle(x)
print(x)
我尝试了以下方法,但是产生了“ None”。
import random
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
random.shuffle(x[2:5]) # need an output like this e.g: [1, 2, 4, 5, 3, 6, 7, 8, 9, 10]
print(x)
但是它没有用。感谢您的帮助。
答案 0 :(得分:3)
shuffle
是就地工作的,因此您需要分割列表的一部分,将其随机排列,然后重新分配到原始列表中。
>>> from random import shuffle
>>>
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
创建随机排列的列表shuffled
。
>>> shuffle_range = slice(2, 5)
>>> shuffled = x[shuffle_range]
>>> shuffle(shuffled)
将shuffled
部分重新分配给原始列表的一部分:
>>> x[shuffle_range] = shuffled
>>>
>>> x
[1, 2, 4, 5, 3, 6, 7, 8, 9, 10]
为了不重复输入索引,我创建了slice(2, 5)
对象。
x
是采用这种方法进行原位变异的,就像您对普通的随机操作所期望的那样。
答案 1 :(得分:3)
shuffle
正常运行。因此,发生的情况是将列表切片x[2:5]
混洗,然后由于没有引用而被丢弃。
您必须这样做:
part = x[2:5]
random.shuffle(part)
x = x[:2] + part + x[5:]
这种天真的方法可以重新创建x
的副本。如果x
很大,而您只是将其中的一小部分改组,则内存开销太大。评论者建议用更好的切片分配代替最后一行:
x[2:5] = part