簡體   English   中英

從字典列表中提取所有鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM