首页 > 解决方案 > 通过索引从字典列表中获取项目

问题描述

我有一个(有序)字典列表,其中列表中的字典内容可能共享相同的键:

list = [{"key1": value1, "key2": value2}, {"key1": value3, "key2": value4}, {"key2": value5, "key3": value6}]

给定一个“全局”索引,我想提取相关的键/值对。例如,给定 index 3,我想返回"key2": value4。我可以看到如何使用嵌套的 for 循环来执行此操作,但是此操作将执行多次并且字典很大,所以我想知道是否有更有效的方法来执行此操作。

标签: pythonpython-3.x

解决方案


您可以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


推荐阅读