python - 通过索引从字典列表中获取项目
问题描述
我有一个(有序)字典列表,其中列表中的字典内容可能共享相同的键:
list = [{"key1": value1, "key2": value2}, {"key1": value3, "key2": value4}, {"key2": value5, "key3": value6}]
给定一个“全局”索引,我想提取相关的键/值对。例如,给定 index 3
,我想返回"key2": value4
。我可以看到如何使用嵌套的 for 循环来执行此操作,但是此操作将执行多次并且字典很大,所以我想知道是否有更有效的方法来执行此操作。
解决方案
您可以itertools.chian.from_iterable
使用itertools.islice
:
from itertools import chain, islice
my_list = [{"key1": 'value1', "key2": 'value2'}, {"key1": 'value3', "key2": 'value4'}, {"key2": 'value5', "key3": 'value6'}]
index = 3
next(islice(chain.from_iterable(map(dict.items, my_list )), index, index + 1))
输出:
('key2', 'value4')
如果您有大量词典,这将提高您的性能
例如,如果您的列表中有 10_000 倍的字典:
my_list = [{"key1": 'value1', "key2": 'value2'}, {"key1": 'value3', "key2": 'value4'}, {"key2": 'value5', "key3": 'value6'}] * 10000
index=3
# @yatu approach
%timeit dict([list(chain.from_iterable(map(dict.items, my_list)))[index]])
# 14.9 ms ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
#using itertools.islice
%timeit next(islice(chain.from_iterable(map(dict.items, my_list )), index, index + 1))
# 1.87 µs ± 63.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
通过使用itertools.islice
,您将获得大约 x7967 倍的运行时间index=3
推荐阅读
- java - SonarQube 自定义规则 - 获取方法参数所有者类
- sqlite - SQLite 如何加入一个额外的表
- electron - Electron-Builder Linux 更新 - APPIMAGE 环境未定义
- javascript - 处理 async/await Angular HttpClient 方法中的错误
- qt - Qml虚拟键盘按键
- ruby-on-rails - 让用户更改密码的最佳方法是什么?(使用 Rails API 和 has_secure_password)
- sql - Oracle 问题分组
- python - 如何在python中手动将十六进制转换为十进制?
- angular - 会话存储后的Angular 2 sessionStorage设置当前值未修改
- reactjs - 左对齐按钮内的内容