[英]get item from a list of dictionaries via index
我有一个(有序)字典列表,其中列表中的字典内容可能共享相同的键:
list = [{"key1": value1, "key2": value2}, {"key1": value3, "key2": value4}, {"key2": value5, "key3": value6}]
给定一个“全局”索引,我想提取相关的键/值对。 例如,给定索引3
,我想返回"key2": value4
。 我可以看到如何使用嵌套的 for 循环来执行此操作,但是此操作将执行多次并且字典很大,所以我想知道是否有更有效的方法来执行此操作。
这是提取dict.items
并使用itertools.chain
展平的一种方法:
from itertools import chain
l = [{"key1": 'value1', "key2": 'value2'}, {"key1": 'value3', "key2": 'value4'}, {"key2": 'value5', "key3": 'value6'}]
index = 3
dict([list(chain.from_iterable(map(dict.items, l)))[index]])
# {'key2': 'value4'}
请注意,对于 python 版本早于3.6
的字典中的插入顺序不会保留。
在这种情况下,您可以做的是将您的字典定义为OrderedDict
,然后执行与上述相同的操作,但改为使用OrderedDict.items
进行映射。
另外作为旁注,不要命名您的列表list
,它会掩盖内置名称。
您可以将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))
output:
('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
,对于index=3
,您将获得大约 x7967 倍的运行时间
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.