【问题标题】:How to loop though range and randomly shuffle a list in Python?python - 如何遍历范围并随机打乱Python中的列表?
【发布时间】:2023-03-12 10:30:02
【问题描述】:

给定一个列表x = [1,0,0,1,1]我可以反复使用random.shuffle(x) 来打乱这个列表,但是如果我尝试这样做一个for循环,列表不会打乱。

例如:

x = [1,0,0,1,1]
k = []
for i in range(10):
     random.shuffle(x)
     k.append(x)
return x

基本上,k包含相同的未洗牌的 x 序列?有什么解决办法吗?

【问题讨论】:

  • random.shuffle就位。您正在使用对同一列表的引用填充k,因此结果中的所有十个列表都将采用相同的随机顺序。也许尝试一个浅拷贝,k.append(x[:])
  • @jonrsharpe 但是在 python shell 中,我能够不断地执行 random.shuffle(x) 并在每次调用后检查 x,x 确实被打乱了。
  • 是的,当然可以,我不是说别的。 k 实际上包含相同的x 序列shuffled,但只有这么多独特的订单,所以有时它与你的起始位置相同。跨度>
  • @jonrsharpe 我明白了!现在我明白了。

标签: python python-3.x python-2.7 list


【解决方案1】:

创建列表的新随机排序的一种 Pythonic 方法是根本不改组。这是一种实现:

[random.sample(x, len(x)) for _ in range(10)]

说明

  • random.sample 创建一个新列表,而不是原地改组。
  • len(x) 是样本的大小。在这种情况下,我们希望输出与原始列表长度相同的列表。
  • 列表推导通常被认为是 python 循环而不是显式 for 循环。

【讨论】:

    【解决方案2】:

    正如@jonrsharpe 所提到的,random.shuffle 作用于适当的列表。当您附加x 时,您正在附加对该特定对象的引用。因此,在循环结束时,k 包含十个指向同一个对象的指针!

    要纠正这个问题,只需在每次迭代时创建一个列表的新副本,如下所示。这是通过在追加时调用list() 来完成的。

    import random
    x = [1,0,0,1,1]
    k = []
    for i in range(10):
         random.shuffle(x)
         k.append(list(x))
    

    【讨论】:

      【解决方案3】:

      试试这个:

      x = [1,0,0,1,1]
      k = []
      for i in range(10):
           random.shuffle(x)
           k.append(x.copy())
      return x
      

      通过将x 替换为x.copy(),您将附加到k 一个新列表,此时该列表看起来像x,而不是x 本身。

      【讨论】:

      • 解释一下您所做的更改以及更改的原因会很有帮助。
      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多