Создать список списков из словаря python - PullRequest
0 голосов
/ 11 марта 2020

У меня есть список словарей, которые я хочу преобразовать во вложенный список с первым элементом этого списка (lst [0]), содержащим ключи словаря, а остальные элементы списка, содержащие значения для каждого словаря. .

[{'id': '123',
  'name': 'bob',
  'city': 'LA'},
 {'id': '321',
  'name': 'sally',
  'city': 'manhattan'},
 {'id': '125',
  'name': 'fred',
  'city': 'miami'}]

Мой ожидаемый результат:

[['id','name','city'], ['123','bob','LA'],['321','sally','manhattan'],['125','fred','miami']]

Каков будет способ go по этому поводу? Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

1 голос
/ 11 марта 2020
>>> d = [{'id': '123',
  'name': 'bob',
  'city': 'LA'},
 {'id': '321',
  'name': 'sally',
  'city': 'manhattan'},
 {'id': '125',
  'name': 'fred',
  'city': 'miami'}]
>>> [list(x[0].keys())]+[list(i.values()) for i in d]
[['id', 'name', 'city'], ['123', 'bob', 'LA'], ['321', 'sally', 'manhattan'], ['125', 'fred', 'miami']]
1 голос
/ 11 марта 2020

Серьезное предложение: Чтобы избежать возможности для некоторых dict с другим порядком итераций, основывайте порядок на первой записи и используйте operator.itemgetter для эффективного получения согласованного порядка из всех записей:

import operator

d = [{'id': '123',
  'name': 'bob',
  'city': 'LA'},
 {'id': '321',
  'name': 'sally',
  'city': 'manhattan'},
 {'id': '125',
  'name': 'fred',
  'city': 'miami'}]

keys = list(d[0])
keygetter = operator.itemgetter(*keys)
result = [keys, *[list(keygetter(x)) for x in d]]  # [keys, *map(list, map(keygetter, d))] might be a titch faster

Если допустимо list из tuple с, это проще / быстрее:

keys = tuple(d[0])
keygetter = operator.itemgetter(*keys)
result = [keys, *map(keygetter, d)]

Несерьезное предположение: Пусть csv сделай это для тебя!

import csv
import io

dicts = [{'id': '123',
  'name': 'bob',
  'city': 'LA'},
 {'id': '321',
  'name': 'sally',
  'city': 'manhattan'},
 {'id': '125',
  'name': 'fred',
  'city': 'miami'}]

with io.StringIO() as sio:
    writer = csv.DictWriter(sio, dicts[0].keys())
    writer.writeheader()
    writer.writerows(dicts)
    sio.seek(0)
    result = list(csv.reader(sio))

Попробуй онлайн!

1 голос
/ 11 марта 2020

вы можете использовать:

d = [{'id': '123',
  'name': 'bob',
  'city': 'LA'},
 {'id': '321',
  'name': 'sally',
  'city': 'manhattan'},
 {'id': '125',
  'name': 'fred',
  'city': 'miami'}]
[[k for k in d[0].keys()], *[list(i.values()) for i in d ]]

вывод:

[['id', 'name', 'city'],
 ['123', 'bob', 'LA'],
 ['321', 'sally', 'manhattan'],
 ['125', 'fred', 'miami']]

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

0 голосов
/ 11 марта 2020

Это можно сделать с помощью встроенного метода для l oop и enumerate () .

listOfDicts = [
    {"id": "123", "name": "bob", "city": "LA"},
    {"id": "321", "name": "sally", "city": "manhattan"},
    {"id": "125", "name": "fred", "city": "miami"},
]

results = []
for index, dic in enumerate(listOfDicts, start = 0):
    if index == 0:
        results.append(list(dic.keys()))
        results.append(list(dic.values()))
    else:
        results.append(list(dic.values()))

print(results)

вывод:

[['id', 'name', 'city'], ['123', 'bob', 'LA'], ['321', 'sally', 'manhattan'], ['125', 'fred', 'miami']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...