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

Aro*_*Aro 0 python list-comprehension python-3.x

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

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
Run Code Online (Sandbox Code Playgroud)

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

scn*_*erd 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
Run Code Online (Sandbox Code Playgroud)

或者,更简洁:

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)]
Run Code Online (Sandbox Code Playgroud)

代码的主要问题是:

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