从字典列表中提取所有键

2024-06-28 19:47:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以前,我有过这样的经历:

[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]

我用fieldnames = list[0].keys()获取列表中的第一个字典并提取它的键。

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

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

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

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

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

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


Tags: csvname列表age字典密钥keyslist
2条回答

您的数据:

>>> LoD
[{'age': 10, 'name': 'Tom'}, 
 {'age': 5, 'name': 'Mark', 'height': 4}, 
 {'age': 7, 'name': 'Pam', 'weight': 90}]

这套理解将做到:

>>> {k for d in LoD for k in d.keys()}
{'age', 'name', 'weight', 'height'}

它是这样工作的。首先,创建dict键列表:

>>> [list(d.keys()) for d in LoD]
[['age', 'name'], ['age', 'name', 'height'], ['age', 'name', 'weight']]

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

>>> [i for s in [d.keys() for d in LoD] for i in s]
['age', 'name', 'age', 'name', 'height', 'age', 'name', 'weight']

并创建一个集以消除重复项:

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

可以简化为:

{k for d in LoD for k in d.keys()}
all_keys = set().union(*(d.keys() for d in mylist))

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

相关问题 更多 >