在给定的两个元素之间混洗所有元素

时间:2018-10-20 09:09:15

标签: python list random

我知道如何重新整理元素列表。但是,如果我想对两个特定元素之间的所有元素进行混洗,应该怎么做。

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)

但是它没有用。感谢您的帮助。

2 个答案:

答案 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