![](/img/trans.png)
[英]Getting the item with the maximum value in list of dicts after grouping the dict by key
[英]Getting the key from a value within a dict of dicts
我有一個字典dict_of_dicts={1:{'id':1,'name':'joe'},2: {'id':2,'name':'jim'},3: {'id':3,'name':'bob'}}
(結構不受我控制,所以我不能更方便地定義我的字典)。 我正在尋找包含'name':'bob'
的子字典的 id # (也對應於上部字典的鍵)。 即我想提取特定名稱的 id 值。
我已經想到了一個循環解決方案,但是關於這個,go 是否有更 Pythonic 的方式? 我的嘗試如下
for i in list(dict_of_dicts.values()):
if i['name']=='bob':
print(i['id'])
這是您可以嘗試的解決方案,
search_ = 'bob'
for k, v in dict_of_dicts.items():
if search_ in v.values():
print(f"Id {k}")
break
else:
print("No Match Found")
編輯
def search_(key):
for k, v in dict_of_dicts.items():
if key in v.values():
return k
return -1 # Indicating no match found
for k, v in dict_of_dicts.items():
if v["name"] == "bob":
print(v["id"])
你也可以只print(k)
即使結構超出您的控制范圍,如果您想要進行多次搜索,在 searchign 多次之前重新格式化數據可能是有意義的,如果需要,您可以稍后再次匹配結果:
d = {1:{'id':1,'name':'joe'},2: {'id':2,'name':'jim'},3: {'id':3,'name':'bob'}}
n = {e['name']:e['id'] for e in d.values()}
n.get('bob')
#Out[32]: 3
或者,您可以使用filter
function 通過傳遞 lambda 如果名稱與搜索條件匹配則解析為True
。 如果沒有匹配項,則在使用next
項目抓取第一個項目時,我傳入了默認值{'id': None}
。
filtered = filter(lambda x: x['name'] == 'bob', dict_of_dicts.values())
match = next(filtered, {'id': None})
print(match['id'])
單線:
d={1:{'id':1,'name':'joe'},2: {'id':2,'name':'jim'},3: {'id':3,'name':'bob'}}
print ([ k for k,v in d.items() if 'bob' in v['name'] ])
Output:
[3]
在這里你會得到一個鍵/id 的列表,以防你有多個 id 為 ''name':'bob'。
您可以使用next()在生成器中找到滿足您需求的第一個實例:
dict_of_dicts = {
1: {
'id': 1,
'name': 'joe'
},
2: {
'id': 2,
'name': 'jim'
},
3: {
'id': 3,
'name': 'bob'
}
}
# Find "bob"
try:
id_bob = next(
dict_of_dicts[key]["id"]
for key in dict_of_dicts
if dict_of_dicts[key]["name"] == "bob"
)
except StopIteration:
print("'bob' not found, handle this some way")
raise
# bob_id == 3
如果您確定"id"
與key
的值相同,只需使用key
而不是dict_of_dicts[key]["id"]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.