Как создать список словарей из списка списков в python? - PullRequest
1 голос
/ 06 ноября 2019

Существует список списков с именем "people": people=[['Sara Smith', 42, 'female', 35000], ['John Lee', 25, 'male', 25000]] Я хотел бы создать список словарей: person=[{'name:'Sara Smith', 'age':42, 'gender':'female', 'income':35000}, {'name:'John Lee', 'age':25, 'gender':'male', 'income':25000}] Как я могу это сделать?

Я пробовал это:

fields=['name', 'age', 'gender', 'income']
print(len(people))
for i in range(0, len(people)):
    exec("people%d = %s" % (i + 1, repr(people[i])));
    person=[]
    person.append(dict(zip(fields, people[i])))
    print(people[i])
print(person)

Но по какой-то причине в результате «print (person)» у меня есть [{'name': 'John Lee', 'age': 25, 'пол': 'male', 'доход ': 25000}]. Я не могу понять, почему мой результат включает в список только словарь для людей [1] и, возможно, есть более элегантные решения для задачи

Ответы [ 4 ]

3 голосов
/ 06 ноября 2019

Вы можете использовать dict() и zip fields в каждом, используя понимание списка.

people=[['Sara Smith', 42, 'female', 35000], ['John Lee', 25, 'male', 25000]]
fields = ['name', 'age', 'gender', 'income']

dict_people = [dict(zip(fields, l)) for l in people]

Результат:

[{'name': 'Sara Smith', 'age': 42, 'gender': 'female', 'income': 35000}, {'name':'John Lee', 'age': 25, 'gender': 'male','income': 25000}]
2 голосов
/ 06 ноября 2019

Это гораздо более чистый способ сделать это

people=[['Sara Smith', 42, 'female', 35000], ['John Lee', 25, 'male', 25000]]
fields=['name', 'age', 'gender', 'income']
person=[]
for i in people:
    person.append(dict(zip(fields, i)))
print(person)

Вывод:

[{'name': 'Sara Smith', 'age': 42, 'sex': «женщина», «доход»: 35000}, {«имя»: «Джон Ли», «возраст»: 25, «пол»: «мужчина», «доход»: 25000}]

1 голос
/ 06 ноября 2019

Вы можете сделать все это с помощью одного словаря. Я действительно очень рекомендую избегать использования exec, если вам это абсолютно не нужно.

Попробуйте что-то вроде этого:

person_dicts = [{"name": person[0], "age": person[1], "gender": person[2], "income": person[3]} for person in people]

Выходы:

[{'name': 'Sara Smith', 'age': 42, 'gender': 'female', 'income': 35000}, {'name': 'John Lee', 'age': 25, 'gender': 'male', 'income': 25000}]

Хотяэто предполагает, что подсписок вашего списка людей для одного человека всегда упорядочен одинаково.

Редактировать:

Если вы не хотите использовать понимания, вы всегда можете также просто использовать цикл for.

person_dicts = []
for person in people:
    person_dicts.append({"name": person[0], "age": person[1], "gender": person[2], "income": person[3]})
0 голосов
/ 06 ноября 2019

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

people=[['Sara Smith', 42, 'female', 35000], ['John Lee', 25, 'male', 25000]]
fields=['name', 'age', 'gender', 'income']

persons = []
for person in people:
    tmp_dict = {}
    for key, value in zip(fields, person):
        tmp_dict[key] = value
    persons.append(tmp_dict)

Результаты:

[
  {'age': 42, 'gender': 'female', 'income': 35000, 'name': 'Sara Smith'},
  {'age': 25, 'gender': 'male', 'income': 25000, 'name': 'John Lee'},
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...