[英]Extract all keys from a list of dictionaries
我正在嘗試獲取字典列表中所有鍵的列表,以便填寫 csv.DictWriter 的字段名參數。
以前,我有這樣的事情:
[
{"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"]
all_keys = set().union(*(d.keys() for d in mylist))
編輯 :必須解壓縮列表。 現在修好了。
你的數據:
>>> 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()}
>>> lis=[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5, "height":4},
{"name": "Pam", "age": 7, "weight":90}
]
>>> {z for y in (x.keys() for x in lis) for z in y}
set(['age', 'name', 'weight', 'height'])
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))
)
以下示例將提取鍵:
set_ = set()
for dict_ in dictionaries:
set_.update(dict_.keys())
print set_
從@ AshwiniChaudhary的回答中借用lis
,這里是對如何解決問題的解釋。
>>> lis=[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5, "height":4},
{"name": "Pam", "age": 7, "weight":90}
]
直接在dict上迭代返回其鍵,因此您不必調用keys()
來取回它們,在列表中保存函數調用和每個元素的列表構造。
>>> {k for d in lis for k in d}
set(['age', 'name', 'weight', 'height'])
或使用itertools.chain
:
>>> from itertools import chain
>>> {k for k in chain(*lis)}
set(['age', 'name', 'weight', 'height'])
如果訂單對您很重要,請繼續閱讀...
輸入您的數據:
>>> list_of_dicts = [{'age': 10, 'name': 'Tom'},{'age': 5, 'name': 'Mark', 'height': 4}, {'age': 7, 'name': 'Pam', 'weight': 90}]
定義您的 function:
>>> def get_all_keys_in_order(list_of_dicts):
ordered_keys = []
for dict_ in list_of_dicts:
for key in dict_:
if key not in ordered_keys:
ordered_keys.append(key)
return ordered_keys
運行你的 function 得到 output:
>>> get_all_keys_in_order(list_of_dicts)
['age', 'name', 'height', 'weight']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.