在许多词典中按值反向搜索



一堆像这样的小字典:

born_place = {"David":"New York", "Juan":"Dallas"}
childhood_place = {"David":"Los Angeles"}
school_place = {"Mike":"New York", "David":"Houston"}
work_place = {"Kate":"Phoenix"}
university_place = {"Mike":"Chicago"}

我想在城市列表中检查所有相关的名称(无论"xx_place"是什么(:

New York, Los Angeles, Chicago, Houston, Phoenix, Dallas

通过执行以下行,我能够检查";born_place";1个城市:

New_York = []
Chicago = []
Houston = []
Phoenix = []
Dallas = []
try:
ny = list(born_place.keys())[list(born_place.values()).index('New York')] # reverse search in a dictionary
New_York.append(ny)
except:
pass
print (New_York)

代码块仅适用于1个城市的1个xx_place。有5个名额的6个城市需要30个街区的这些代码。(如果城市和xx_place的列表更长…(

如果不使用defaultdict,您可以按如下方式使用setdefault:

born_place = {"David":"New York", "Juan":"Dallas"}
childhood_place = {"David":"Los Angeles"}
school_place = {"Mike":"New York", "David":"Houston"}
work_place = {"Kate":"Phoenix"}
university_place = {"Mike":"Chicago"}
result = {}
for d in born_place, childhood_place, school_place, work_place, university_place:
for k, v in d.items():
result.setdefault(v, []).append(k)
print(result)

输出:

{'New York': ['David', 'Mike'], 'Dallas': ['Juan'], 'Los Angeles': ['David'], 'Houston': ['David'], 'Phoenix': ['Kate'], 'Chicago': ['Mike']}

字典可以组合在一起并遍历

from collections import defaultdict

born_place = {"David":"New York", "Juan":"Dallas"}
childhood_place = {"David":"Los Angeles"}
school_place = {"Mike":"New York", "David":"Houston"}
work_place = {"Kate":"Phoenix"}
university_place = {"Mike":"Chicago"}
res = defaultdict(list)
for item in [born_place, childhood_place, school_place, work_place, university_place]:
for k, v in item.items():
res[v].append(k)
print(dict(res))
# {'New York': ['David', 'Mike'], 'Dallas': ['Juan'], 'Los Angeles': ['David'], 'Houston': ['David'], 'Phoenix': ['Kate'], 'Chicago': ['Mike']}

IIUC,您可以使用defaultdict(list)并插入dictnamecitykey

如果城市列表和xx_place较长如果dicts中存在所有city_name,并且您不想检查。您不需要创建城市列表,您可以为xx_place创建dict列表。

from collections import defaultdict
res = defaultdict(list)
# You can create a list of dict
# places = [{"David":"New York", "Juan":"Dallas"}, 
#           {"David":"Los Angeles"}, 
#           {"Mike":"New York", "David":"Houston"}, 
#           {"Kate":"Phoenix"}, {"Mike":"Chicago"}]
# if you want to use 'list' of 'dict'
# for place in places:
for place in [born_place, childhood_place, school_place, 
work_place, university_place]:
for k,v in place.items():
res[v].append(k)

print(res)

{
'New York': ['David', 'Mike'], 
'Los Angeles': ['David'], 
'Chicago': ['Mike'], 
'Houston': ['David'], 
'Phoenix': ['Kate'], 
'Dallas': ['Juan']
}

使用if语句而不是defaultdict:

born_place = {"David":"New York", "Juan":"Dallas"}
childhood_place = {"David":"Los Angeles"}
school_place = {"Mike":"New York", "David":"Houston"}
work_place = {"Kate":"Phoenix"}
university_place = {"Mike":"Chicago"}
places = [born_place, childhood_place, school_place, work_place, university_place]
results = {}
for d in places:
for k, v in d.items():
if v not in results.keys():
results[v] = []
results[v].append(k)

print(results['New York'])

最新更新