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

标签 python dictionary

我有一个字典的字典,每个嵌套的字典都有完全相同的键,就像这样:

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/

相关文章:

python - 如何将 "google.cloud.documentai_v1.types.document"对象转换为 json

python - 汇编的十六进制内存地址

arrays - 如何快速将字典分配给 AnyObject

python - 替换 "tf.gather_nd"

Python/tox 将依赖项安装为可编辑

python - 编写 Boto3 过滤器以使用自定义标签名称的正确方法是什么?

python - 消除 ',' .join() 调用生成的双引号

java - 对象字典,其中 key 是 Java 中的实例字段

python - 如何在 Python 中动态构建树

Bundle中的Android HashMap?