【问题标题】:Iterative grow a shuffled list in python在python中迭代增长一个打乱的列表
【发布时间】:2012-04-13 15:33:01
【问题描述】:

我正在尝试迭代地打乱一个包含 4 个元素的列表,然后将打乱的列表附加到一个不断增长的列表中。结果将是一个长度为 4 个元素的倍数的列表,每四个元素是我原始列表的某种组合。

我的代码是

import random
list1 = ['X','Y','Z','Q']
list2 = []
for drop in range(0,72/4):
     random.shuffle(list1)
     list2.append(list1)

我似乎遇到的问题是 list2 将一遍又一遍地成为 list1 的相同洗牌版本。

示例列表2:['Q','X',Z','Y','Q','X',Z','Y','Q','X',Z','Y ',...]

【问题讨论】:

    标签: python list random


    【解决方案1】:

    我想你想写

    list2.extend(list1)
    

    否则,您将一遍又一遍地将对象 list1 的相同实例添加到 list2。

    【讨论】:

    • list2.append(list1) 一遍又一遍地添加同一个实例有什么原因吗?我的逻辑是,在每个循环中,list1 都会重新排列。
    • 首先,请注意list2.append(list1) 不会将list1 的元素添加到list2。您将 list1 本身添加到 list2 (['X', 'Y', 'Z', 'Q' ] vs. [['X', 'Y', 'Z', 'Q']])。由于没有复制 list1,random.shuffle(list1) 会更改 list2 中所有出现的 list1。
    【解决方案2】:

    当您将一个列表附加到另一个列表时,您并没有制作该列表的副本 - 您正在附加对原始列表的另一个引用。你所有的追加尝试实际上都是对同一个对象的引用,对一个对象的修改就是对所有对象的修改。

    这是一个令人惊讶的结果的演示。

    >>> list1 = ['X', 'Y', 'Z', 'Q']
    >>> list2 = []
    >>> list2.append(list1)
    >>> list2.append(list1)
    >>> list2
    [['X', 'Y', 'Z', 'Q'], ['X', 'Y', 'Z', 'Q']]
    >>> list2[0][0] = 'A'
    >>> list2
    [['A', 'Y', 'Z', 'Q'], ['A', 'Y', 'Z', 'Q']]
    >>> list1[0] = 'B'
    >>> list2
    [['B', 'Y', 'Z', 'Q'], ['B', 'Y', 'Z', 'Q']]
    

    【讨论】:

      【解决方案3】:

      当您将 list1 打乱时,您会打乱 list1 的所有实例。当您将 list1 附加到 list2 时,您只是一遍又一遍地改组同一个列表。

      尝试使用deepcopy

      import random, copy
      list1 = [1,2,3,4]
      list2 = []
      for i in xrange(10):
          random.shuffle(list1)
          list2.append(copy.deepcopy(list1))
      

      【讨论】:

      • 也许copy.deepcopy() 有点过分了。一个简单的list1[:] 就可以了。
      猜你喜欢
      • 2021-08-06
      • 2021-08-09
      • 1970-01-01
      • 2015-04-29
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      相关资源
      最近更新 更多