[英]How to get value from list of dictionaries based on specific key value which does not exist in all dictionaries?
我有一個這樣的字典列表:
{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']},
我確實有一本這樣的字典,它可能有很多相同的鍵,但很多也沒有那個鍵。 如上例,我們在前 3 個中有 name key,但在第 4 個中沒有 name key。 我正在嘗試獲取具有鍵“名稱”的所有值的列表。
謝謝
您想要什么不清楚(也不清楚指向pandas或numpy的鏈接)。
如果您只是想要 name 存在的值:
l = [{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']},]
out = [d['name'] for d in l if 'name' in d]
# [['Sam'], ['Jon'], ['Jon']]
# or as flat list
out = [name for d in l if 'name' in d for name in d['name']]
# ['Sam', 'Jon', 'Jon']
# or just the first name
out = [d['name'][0] for d in l if 'name' in d]
# ['Sam', 'Jon', 'Jon']
這是一種提取所有名稱的方法:
data = [
{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']},
]
names = [item['name'][0] for item in data if 'name' in item]
print(names)
結果:
['Sam', 'Jon', 'Jon']
我假設您的數據是一個字典列表。
data = [{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']},]
您可以獲得具有名稱鍵的所有元素的子列表,如下所示:
output = [elem for elem in data if elem.get("name")]
有很多方法可以做到這一點。 一個是:
_list = [{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']}]
print(*(name for d in _list if (name := d.get('name'))))
Output:
['Sam'] ['Jon'] ['Jon']
您可以嘗試列表表達式:
all_dicts = [{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']}]
dicts_with_name = [d.values() for d in all_dicts if 'name' in d.keys() ]
這將提取列表中那些具有名稱字段的字典的所有值(對於所有鍵)。 如果你想要鍵值對,你可以d.items()
而不是d.values()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.