2017-04-19 75 views
1

我有下令字典的名单看起来类似如下蟒蛇 - 查找匹配值的所有索引有序字典

[OrderedDict([('a', 1), ('b', 2)]), OrderedDict([('a', 1), ('b', 3)]), OrderedDict([('a', 2), ('b', 2)]), OrderedDict([('a', 3), ('b', 2)]), OrderedDict([('a', 1), ('b', 3)])] 

我想保存列表索引在数组列表,其是的a价值1 所以,我的列表将包含以下元素

[0,1,4]

我有一个传统的脚本来获取这些值,但由于我的原始列表持有超过一百万个有序的字典,因此需要较长的时间才能获取这些元素。

for ele in range(len(liso)): 
if(liso[ele]['a'] ==1): 
    giso.add(ele) 

有人可以帮助我重写使用mapfilter优化查询上面的脚本?

+0

首先,Python版本是这个?另外,究竟是什么'giso'? – roganjosh

回答

2

列表综合:[i for i, x in enumerate(liso) if x['a'] == 1]

筛选:

如果你使用的是Python 2:filter(lambda i: liso[i]['a'] == 1, xrange(len(liso)))

如果你使用Python 3:list(filter(lambda i: liso[i]['a'] == 1, range(len(liso))))

+1

为什么你会在这里使用'range(len())'?特别是如果这是Python 2. – roganjosh

+0

@roganjosh你还会推荐什么? –

+0

笔记本电脑死了,在电话上现在这么格式化。在Python 2中,范围将创建整个列表而不是迭代器。在python 2中,改用'xrange'(OP没有从我的问题中阐明)。对于这个例子:'[如果项目['a'] == 1]',项目在liso中''。 – roganjosh