Python 从dict中的值获取密钥

Python 从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
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,请参见编辑。。