8

我想创建一个列表,其中包含 x 数量的字典,它们都包含相同的键,但在 for 循环中具有不同的值:

就像是

[{'name': Brenda, 'Age': 22, 'Sex': Female},
 {'name': Jorda, 'Age': 32, 'Sex': Male},
 {'name': Richard, 'Age': 54, 'Sex': Male}]

我的代码是这样的:

people = []
person = {}

humans = gethumans()

for human in humans:
    number_people, people_data = People.data()
    person['name'] = human.name
    person['age'] = human.age
    person['Sex'] = human.name
    people.append(person)

我的输出是这样的:

[{'name': Richard, 'Age': 54, 'Sex': Male},
 {'name': Richard, 'Age': 54, 'Sex': Male}
 {'name': Richard, 'Age': 54, 'Sex': Male}]

由于字典值被替换而不是添加,它只是附加了同一个字典。我怎样才能解决这个问题?

4

2 回答 2

7

当您将字典人员附加到列表人员时,您只是将字典的引用附加到列表中,因此列表最终只包含对 SAME 字典的引用。

由于每次循环都会用新值覆盖字典,因此列表最后只包含对您添加的最后一个人的引用。

您需要做的是为每个人创建一个新字典,例如:

for human in humans:
    number_people, people_data = People.data()
    person = dict()
    person['name'] = human.name
    person['age'] = human.age
    person['Sex'] = human.name
    people.append(person)
于 2018-10-07T08:41:44.850 回答
2

您每次都编辑同一个词典,因此您构建新词典,而是编辑旧词典。由于您每次都将相同的字典附加到列表中,因此最终列表包含n次相同的字典,并且所有编辑都在该字典上处理。

因此,您必须在循环的每次迭代中构造一个新字典for

people = []
humans = gethumans()

for human in humans:
    number_people, people_data = People.data()
    person = {
        'name': human.name,
        'age': human.age,
        'sex': human.sex
    }
    people.append(person)

我在这里替换'Sex''sex'(因为键名不一致很奇怪),并使用human.sexhuman.name.

这里people.data()似乎没有做任何事情,因此您可以在此处使用列表推导来生成列表:

people = [
    { 'name': human.name, 'age': human.age, 'sex': human.sex }
    for human in humans
]

这将构建一个包含所有字典的列表。鉴于for循环没有副作用(看起来就是这种情况),上述方法将起作用。

于 2018-10-07T08:35:32.057 回答