如何在Python中重新洗牌已洗牌的列表
我正在用Python 3对嵌套列表进行洗牌操作。我希望能无限次地重新洗牌,直到这些嵌套列表的顺序符合特定的条件。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 个回答
2
一直把元素移动到最前面,感觉效率不高。为什么不把那个元素先拿出来,然后把剩下的部分打乱,再把那个元素放到最前面呢?
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)