尝试遍历列表列表并更新值

时间:2017-10-16 18:53:15

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

我正在尝试按如下方式创建数据结构:

import random

class Person:
    DNA = [[{}] * 100] * 10 # 10 chromosomes, 100 genes in each?

    def __init__(self):
        DNA = Persona.DNA

        # Generate random variables to create DNA
        for chromosome, _ in DNA:
            for gene, _ in chromosome:
                if random.randint(0, 3) == 3:
                    DNA[chromosome][gene]['Str'] = 3

        self.DNA = DNA

我收到了错误," ValueError:解压缩的值太多(预期2)"但我不明白我做错了什么。为什么我不能枚举?

1 个答案:

答案 0 :(得分:5)

应用所有@ Jean-Francois的建议:

import random

class Person:
    def __init__(self):
        DNA = [[dict() for _ in range(100)] for _ in range(10)]

        # Generate random variables to create DNA
        for chromosome in DNA:
            for gene in chromosome:
                if random.randint(0, 3) == 3:
                    gene['Str'] = 3

        self.DNA = DNA

或者,更简洁:

class Person:
    def __init__(self):
        self.DNA = [[dict(Str=3) if random.randint(0,3) == 3 else dict()
                     for _ in range(100)]
                    for _ in range(10)]

代码的主要问题是:

  1. 要从数组中获取(idx, item)元组,请使用enumerate。例如,for i, chromosome in enumerate(DNA):。否则,在列表上循环只会产生该列表中的项目。
  2. 您正在复制对象,而不是制作新对象。这会咬你,因为你没有1000个词典,你有1个字典,在100个列表中引用,所有这些都在10个其他列表中被引用。任何get / set到那个字典,或者这100个列表中的一个,都将显示在该对象被引用的其他地方。
  3. 同样,类变量只创建一次,然后从该类的每个实例中引用它,这意味着只有一个人的DNA。就像你需要一个新列表和DNA阵列中每个点的dict一样,你需要为每个人提供一个新的DNA链对象。