【问题标题】:Functionally shuffling a list在功能上改组列表
【发布时间】:2017-11-06 11:53:33
【问题描述】:

关于随机模块的random.shuffle方法,有不少questions堆栈溢出。

shuffle 让我恼火的是,它在原地洗牌,而不是返回一个洗牌的副本。

请注意,shuffle 可以正常工作,并返回 None。

因此表达类似

for index, (parent1, parent2) in enumerate(zip(sorted(population)[::2], shuffle(population)[1::2])):

不工作。用副作用编写它似乎不必要地冗长:

other_half = population[1::2]
random.shuffle(other_half)
for index, (parent1, parent2) in enumerate(zip(sorted(population)[::2], other_half):

在功能上洗牌列表的pythonic方法是什么?

【问题讨论】:

    标签: python list random


    【解决方案1】:

    这看起来像是 this question 的副本

    接受的答案是

    shuffled = sorted(x, key=lambda k: random.random())
    

    【讨论】:

    • 它确实看起来像复制品。我发现标题对另一个问题具有误导性,也是因为它没有出现在我的谷歌搜索问题中。也许将问题与您的链接一起保留在这里是有价值的。
    【解决方案2】:

    一个不错的选择是random.samplek 是列表中的len

    import random
    
    li = [1, 2, 3, 4, 5]
    
    for _ in range(4):  # showing we get a new, 'shuffled' list
        print(random.sample(li, len(li)))
    
    # [5, 2, 3, 1, 4]
    # [1, 5, 4, 3, 2]
    # [4, 2, 5, 1, 3]
    # [4, 2, 3, 5, 1]
    

    【讨论】:

    • 我喜欢这种方法。我想知道是否有任何合理的选择。在我看来,sample 方法有点混淆了意图。
    • @SebastianWozny 我认为这值得商榷。如果您从带有x 元素的列表中选择x 随机元素,那么您实际上是在打乱列表。但是,您可以始终使用您自己的名称将其包装在您自己的函数中。
    猜你喜欢
    • 2021-12-21
    • 2012-11-16
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2019-08-12
    相关资源
    最近更新 更多