2015-10-19 30 views
0

我已閱讀了一些文章和論壇帖子,但還沒有完全想出如何改進下面。我有一個需要用兩種方式過濾的字典列表。Python中的字典列表的雙重過濾器

jsonData = [{'a':'1a', 'b':'1b', 'c':'1c'},{'a':'2a','b':'2b', 'c':'2c'}, {'a':'3a','b':'3b', 'c':'3c'}] 

我想刪除列表中鍵c對應於3c的任何字典。下面的第一行就是這樣。然後我只想保留b和c鍵以及相應的值。這是其餘的事情。這一切都有效,但我想知道第二部分是否也可以用列表理解來表達,以及是否有其他方法可以簡化它。

jsonData = [i for i in jsonData if i['c'] != '3c'] 
for i in range(len(jsonData)): 
    jsonData[i] = {key:value for key,value in jsonData[i].items() if key in ['b','c']} 

非常感謝您

回答

1

您可以使用keyviews的set-like特性將d的搜索範圍限制爲僅實際使用的鍵,而不是迭代所有鍵。

jsonData = [{k: d[k] for k in (d.keys() & {'b', 'c'})} for d in jsonData if d['c'] != '3c'] 

如果這是在Python 2.7版,而不是Python的3.x的,那麼d.keys()應該是d.viewkeys()

+0

在性能方面,您需要測試是否最好使用我使用的set-literal或在理解之外創建的集合,以及是否將其放置在keysview的創建的左側或右側;這可能很容易因爲實施細節而有所不同,所以如果性能是一個嚴重問題,那麼您需要驗證。 – ShadowRanger

+0

非常感謝!您的解決方案完美運作仔細觀察性能。 – paul

0

我相信這樣的事情會做的伎倆:

[{key:value for key,value in jdata.items() if key in ['b', 'c']} 
for jdata in jsonData if jdata['c'] != '3c'] 

它給提供的列表返回

[{'c': '1c', 'b': '1b'}, {'c': '2c', 'b': '2b'}]