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

2 投票
2 回答
1877 浏览
提问于 2025-04-17 07:45

我正在用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)

撰写回答