Python 从dict中的值获取密钥
我有一个dict of dictsPython 从dict中的值获取密钥,python,dictionary,Python,Dictionary,我有一个dict of dictsdict of dicts={1:{'id':1,'name':'joe'},2:{'id':2,'name':'jim'},3:{'id':3,'name':'bob'}(这个结构超出了我的控制,所以我无法更方便地定义我的dict)。我希望提取包含“name”:“bob”的子目录的id#(它也对应于上一个目录的键)。i、 e我要提取特定名称的id值 我已经想到了一个循环解决方案,但是有没有一种更符合python的方法呢?我的尝试如下 for i in list
dict of dicts={1:{'id':1,'name':'joe'},2:{'id':2,'name':'jim'},3:{'id':3,'name':'bob'}
(这个结构超出了我的控制,所以我无法更方便地定义我的dict)。我希望提取包含“name”:“bob”
的子目录的id#(它也对应于上一个目录的键)。i、 e我要提取特定名称的id值
我已经想到了一个循环解决方案,但是有没有一种更符合python的方法呢?我的尝试如下
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
这是您可以尝试的解决方案
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
您也可以只打印(k)
您也可以只打印(k)即使结构不在您的控制范围内,如果您想要进行多次搜索,在多次搜索前重新格式化数据可能是有意义的,如果需要,您可以稍后再次匹配结果:
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
即使结构超出您的控制范围,如果您希望进行多次搜索,在多次搜索之前重新格式化数据可能是有意义的,如果需要,您可以稍后再次匹配结果:
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
或者,如果名称与搜索条件匹配,您可以通过传递解析为
True
的lambda来使用filter
函数。如果没有匹配项,则使用next
item抓取第一项时,我传入了默认值{id':None}
filtered = filter(lambda x: x['name'] == 'bob', dict_of_dicts.values())
match = next(filtered, {'id': None})
print(match['id'])
或者,如果名称与搜索条件匹配,您可以通过传递解析为
True
的lambda来使用filter
函数。如果没有匹配项,则使用next
item抓取第一项时,我传入了默认值{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'] ])
输出:
[3]
如果您有多个带有“name”:“bob”的id,您可以在这里获得一个键/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'] ])
输出:
[3]
如果您有多个带有“name”:“bob”的id,您可以在这里获得一个键/id列表。您可以使用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”
与键
的值相同,只需使用键
而不是dict of dicts[key][“id”]
即可使用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”
与键的值相同,只需使用键
而不是dict of dicts[key][“id”]
您不需要列表()
,for循环可以在任何迭代器上工作,包括dict.values()
您不需要列表()
,for循环可用于任何迭代器,包括dict.values()
Valid comment,我已将其从我的答案中删除。Valid comment,我已将其从我的答案中删除。是否有方法不在第一个print语句中使用regex格式来执行此操作?实际上,我想在函数中以int形式返回id,但在示例中我使用了print,因为它是一个易于使用的函数。@hex93,请参见编辑。。有没有办法不在第一个print语句中使用regex格式来执行此操作?实际上,我想在函数中以int形式返回id,但我在示例中使用了print,因为它是一个易于使用的函数。@hex93,请参见编辑。。