如何在Python中重新洗牌洗牌列表

时间:2011-12-05 17:42:41

标签: python random shuffle

我正在Python 3中的嵌套列表上执行shuffle操作。我希望无限期地重新洗牌先前洗牌的列表,直到嵌套列表的顺序符合特定条件。 random.shuffle在原地操作并且在先前洗牌的列表上调用random.shuffle()不会重新洗牌。在符合条件之前无限期重新调整列表的最佳方法是什么。例如,我正在尝试这样的事情,但是制作一个新列表然后改组它似乎不起作用:

from random import shuffle

L1 = [[1,2], [3,4], [5,6], [7,8], [9,10]]
shuffle(L1)
match = L1[0]

# reshuffle until [9,10] is the first item in the list
if match != [9,10]:
    L1 = list(L1)
    shuffle(L1)
print(L1)

2 个答案:

答案 0 :(得分:2)

在某个元素位于前面之前保持随机播放似乎效率低下。为什么不把那个元素取出来,把剩下的元素洗牌,然后将那个元素放在前面?

答案 1 :(得分:1)

本声明:

  

在先前洗牌的列表上调用random.shuffle()不会重新洗牌

这是不正确的。观察:

Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> L1 = [[1,2], [3,4], [5,6], [7,8], [9,10]]
>>> from random import shuffle
>>> shuffle(L1)
>>> print L1
[[3, 4], [9, 10], [5, 6], [7, 8], [1, 2]]
>>> shuffle(L1)
>>> print L1
[[9, 10], [3, 4], [5, 6], [1, 2], [7, 8]]
>>> 

以下代码应该可以执行您想要的操作,尽管它具有非确定性运行时。

from random import shuffle

L1 = [[1,2], [3,4], [5,6], [7,8], [9,10]]
match = [9,10]
while L1[0]!=match:
    shuffle(L1)
print(L1)