我有一个字典的字典,每个嵌套的字典都有完全相同的键,就像这样:
all_dicts = {'a':{'name': 'A', 'city': 'foo'},
'b':{'name': 'B', 'city': 'bar'},
'c':{'name': 'C', 'city': 'bar'},
'd':{'name': 'B', 'city': 'foo'},
'e':{'name': 'D', 'city': 'bar'},
}
如何获取 'city'
值为 'bar'
的所有字典的列表(或字典)?
以下代码有效,但不可扩展:
req_key = 'bar'
selected = []
for one in all_dicts.keys():
if req_key in all_dicts[one]:
selected.append(all_dicts[one])
假设 'city'
可以有 50,000 个唯一值,字典 all_dicts
包含 600,000 个值,为 'city'< 的每个值迭代字典
效率不高。
是否有一种可扩展且高效的方法来做到这一点?
最佳答案
您可以做的是在该字典上创建一个索引,如下所示:
cityIndex={}
for item in all_dicts.values():
if item['city'] in cityIndex:
cityIndex[item['city']].append(item)
else:
cityIndex[item['city']]=[item]
这将需要一些初始处理时间以及一些额外的内存,但之后会非常快。如果您想要所有带有 cityName
的项目,您可以通过以下方式获得它们:
mylist=cityIndex[cityName] if cityName in cityIndex else []
如果 all_dicts
构建一次并在之后多次查询,这会给您带来很多好处。
如果 all_dicts
在程序执行期间被修改,您将需要更多代码来维护 cityIndex
。如果将 item
添加到 all_dicts
,只需执行以下操作:
if item['city'] in cityIndex:
cityIndex[item['city']].append(item)
else:
cityIndex[item['city']]=[item]
如果删除了某个项目,这也是将其从索引中删除的直接方法(假设“名称”和“城市”的组合在您的项目中是唯一的):
for i, val in enumerate(cityIndex[item['city']]):
if val['name']==item['name']:
break
del cityIndex[item['city']][i]
如果查询比更新多很多,您仍然会获得巨大的性能提升。
关于python - 如何访问特定键具有特定值的字典中的所有字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41566456/