2017-04-19 60 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