当前位置:  开发笔记 > 编程语言 > 正文

如何访问特定键具有特定值的字典中的所有字典

如何解决《如何访问特定键具有特定值的字典中的所有字典》经验,为你挑选了2个好方法。

我有一个字典字典,每个嵌套字典都有完全相同的键,如下所示:

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'都不是很有效.

有可扩展且有效的方法吗?



1> xzoert..:

你可以做的是在该字典上创建一个索引,如下所示:

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]

如果一个项目被删除,这也是一种直接从索引中删除它的方法(假设'name'和'city'的组合在你的项目中是唯一的):

for i, val in enumerate(cityIndex[item['city']]):
    if val['name']==item['name']:
        break
del cityIndex[item['city']][i]

如果有更多的查询而不是更新,您仍然可以获得巨大的性能提升.



2> Moses Koledo..:

你必须检查所有的值; 除此之外别无选择.然而,您可以使用矢量化方法 - 列表理解 - 这将比for循环快得多:

selected = [d for d in all_dicts.values() if d['city']=='bar']
print(selected)
# [{'name': 'B', 'city': 'bar'}, {'name': 'C', 'city': 'bar'}, {'name': 'D', 'city': 'bar'}]

使用dict.values而不是访问字典键也可以提高性能,并且在Python 3中也具有内存效率.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有