从词典列表中提取所有键

orh*_*orh 33 python

我正在尝试获取字典列表中的所有键的列表,以便填写csv.DictWriter的fieldnames参数.

以前,我有这样的事情:

[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
Run Code Online (Sandbox Code Playgroud)

我正在使用fieldnames = list[0].keys()列表中的第一个字典并提取其密钥.

现在我有这样的东西,其中一个字典有更多的键:值对比其他字典(可能是任何结果).新密钥是根据来自API的信息动态添加的,因此它们可能会或可能不会出现在每个字典中,而且我事先并不知道会有多少新密钥.

[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5, "height":4},
{"name": "Pam", "age": 7}
]
Run Code Online (Sandbox Code Playgroud)

我不能只使用fieldnames = list[1].keys()它,因为它不一定是第二个元素将有额外的键.

一个简单的解决方案是找到具有最多键数的字典并将其用于字段名,但如果您有这样的示例,那将无效:

[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5, "height":4},
{"name": "Pam", "age": 7, "weight":90}
]
Run Code Online (Sandbox Code Playgroud)

其中第二个和第三个字典都有3个键,但最终结果应该是列表 ["name", "age", "height", "weight"]

Hug*_*ell 55

all_keys = set().union(*(d.keys() for d in mylist))
Run Code Online (Sandbox Code Playgroud)

编辑:必须解压缩列表.现在修好了.


daw*_*awg 18

你的数据:

>>> LoD
[{'age': 10, 'name': 'Tom'}, 
 {'age': 5, 'name': 'Mark', 'height': 4}, 
 {'age': 7, 'name': 'Pam', 'weight': 90}]
Run Code Online (Sandbox Code Playgroud)

这种理解能够做到:

>>> {k for d in LoD for k in d.keys()}
{'age', 'name', 'weight', 'height'}
Run Code Online (Sandbox Code Playgroud)

它以这种方式工作.首先,创建一个dict键列表列表:

>>> [list(d.keys()) for d in LoD]
[['age', 'name'], ['age', 'name', 'height'], ['age', 'name', 'weight']]
Run Code Online (Sandbox Code Playgroud)

然后创建此列表列表的展平版本:

>>> [i for s in [d.keys() for d in LoD] for i in s]
['age', 'name', 'age', 'name', 'height', 'age', 'name', 'weight']
Run Code Online (Sandbox Code Playgroud)

并创建一个集来消除重复:

>>> set([i for s in [d.keys() for d in LoD] for i in s])
{'age', 'name', 'weight', 'height'}
Run Code Online (Sandbox Code Playgroud)

哪个可以简化为:

{k for d in LoD for k in d.keys()}
Run Code Online (Sandbox Code Playgroud)


bwv*_*549 5

from itertools import chain

lis = [
    {"name": "Tom", "age": 10},
    {"name": "Mark", "age": 5, "height":4},
    {"name": "Pam", "age": 7, "weight":90}
]

# without qualification a dict iterates over its keys
# and set takes any iterable in its constructor
headers_as_set = set(chain.from_iterable(lis))

# you asked for a list
headers = list(
    set(chain.from_iterable(lis))
)
Run Code Online (Sandbox Code Playgroud)