简体   繁体   中英

Create a list of lists from a dictionary python

I have a list of dictionaries that I am wanting to convert to a nested list with the first element of that list(lst[0]) containing the dictionary keys and the rest of the elements of the list containing values for each dictionary.

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

My expected output result is:

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

What would be a way to go about this? Any help would be greatly appreciated.

you can use:

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 ]]

output:

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

first, you get a list with your keys then get a list with the values for every inner dict

>>> 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']]

Serious suggestion: To avoid the possibility of some dict s having a different iteration order, base the order off the first entry and use operator.itemgetter to get a consistent order from all entries efficiently:

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

If a list of tuple s is acceptable, this is simpler/faster:

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

Unserious suggestion: Let csv do it for you!

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))

Try it online!

This can be done with for loop and enumerate() built-in method.

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)

output:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM