Создание списка словарей с одинаковыми ключами? - PullRequest
0 голосов
/ 07 октября 2018

Я хотел создать список, содержащий 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 голосов
/ 07 октября 2018

Когда вы добавляете словарь персона к списку люди вы просто добавляете ссылку на словарь в список, так что список заканчивается только ссылками на тот же словарь,

Поскольку каждый раз в цикле вы перезаписываете словарь новыми значениями, в конце список содержит только ссылки на последнего добавленного вами человека.

Вам нужно создать новый словарь для каждого человека, например:

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)
0 голосов
/ 07 октября 2018

Вы каждый раз редактируете один и тот же словарь, поэтому не создаете новый, но редактируете старый.Поскольку вы каждый раз добавляете к списку тот же самый словарь , в конце список содержит один и тот же словарь n раз, и все правки обрабатываются в этом словаре.

Таким образом, вы должны создать новый словарь на каждой итерации в цикле for:

people = []
humans = gethumans()

for human in humans:
    number_people, people_data = People.data()
    <b>person =</b> {
        '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 не имеет побочных эффектов (похоже, так и есть), вышеприведенное сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...