创建具有相同键的词典列表?

时间:2018-10-07 08:31:31

标签: python django dictionary for-loop

我想创建一个包含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}]

由于字典值将被替换而不是添加,并且仅附加相同的字典。我该如何解决?

2 个答案:

答案 0 :(得分:3)

将字典 person 添加到列表 people 时,您只是将字典的引用添加到列表中,因此列表最终仅包含对字典的引用。相同的字典。

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

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

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)

答案 1 :(得分:2)

您每次都编辑 same 词典,因此您 not 不会构造新的字典,而是编辑旧的字典。由于您每次都将 same 词典追加到列表中,因此最终列表包含相同的词典 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.sex而不是human.name

这里people.data()似乎没有任何作用,因此您可以在此处使用列表理解生成列表:

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

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