簡體   English   中英

從字典中的值中獲取鍵

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

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