【问题标题】:How to reshuffle a shuffled list in Python如何在 Python 中重新洗牌
【发布时间】:2011-12-05 17:42:41
【问题描述】:

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

【问题讨论】:

    标签: python random shuffle


    【解决方案1】:

    在某个元素出现在前面之前,一直在洗牌似乎效率很低。为什么不把那个元素取出来,把剩下的洗牌,然后把那个元素放在前面呢?

    【讨论】:

    • 我的例子过于简单化了。我实际上是为每个打乱列表生成一个分数,我需要打乱直到生成高于某个阈值的分数。
    • @dr.bunsen - 然后遍历列表,直到找到可接受的分数。
    • @Buttons840 也许您可以证明您所描述的内容?我确实遍历列表以找到可接受的分数。如果分数不可接受,我需要重新洗牌,直到获得可接受的分数。
    【解决方案2】:

    此声明:

    在先前打乱的列表上调用 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)
    

    【讨论】:

    • 正确,这就是我复制列表的原因L1 = list(L1)
    • 您不需要复制列表。你可以一遍又一遍地重新洗牌——它会重新洗牌。 @Jarek 是对的:我无法理解这可能完成什么任务。您确定没有更好的算法不涉及洗牌吗?
    • 嗯,你确定吗?在我的机器上,运行 shuffle(L1) 会随机播放 L1,但只会随机播放一次。再次运行shuffle(L1) 不会重新排列 L1 列表。谢谢您的帮助。可能有更好的算法,但我认为目前无法绕过重新洗牌。
    • 我更新了我的答案,明确证明shuffle() 将重新洗牌。确实,从逻辑上考虑一下——shuffle() 怎么会知道它已经洗牌了?
    猜你喜欢
    • 2021-04-23
    • 2019-09-20
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多