繁体   English   中英

通过索引从字典列表中获取项目

[英]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_iterableitertools.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM