2016-12-07 42 views
1

說我有字典詞典的過濾器列表:的Python - 基於多鍵

myDict = [{'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
     {'first': 'James', 'middle': 'Johnson', 'last': 'Watt'}, 
     {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'} 
     {'first': 'Robert', 'last': 'Antonio'}] 

而且我有一個列表稱爲鍵:

keys = ["middle", "last"] 

我想根據每個值過濾myDict在鍵,這將導致

filteredDict = [{'middle': 'Smith', 'last': 'Joule'}, 
       {'middle': 'Johnson', 'last': 'Watt'}, 
       {'middle': 'Edward', 'last': 'Doppler'}, 
       {'last': 'Antonio'}] 

如在myDict名單列表中看到字典,詞典不必須有兩個鍵爲了被放入filteredDict。是否有一種簡單的方法可以在Python中使用字典理解來實現這一點?

回答

5

隨着列表內涵:

myDict = [{'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
     {'first': 'James', 'middle': 'Johnson', 'last': 'Watt'}, 
     {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'}, 
     {'first': 'Robert', 'last': 'Antonio'}] 

keys = {"middle", "last"} 

l = [{k:v for k, v in i.items() if k in keys} for i in myDict] 

但你也可以使用map此:

myDict = [{'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
     {'first': 'James', 'middle': 'Johnson', 'last': 'Watt'}, 
     {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'}, 
     {'first': 'Robert', 'last': 'Antonio'}] 

keys = {"middle", "last"} 

l = list(map(lambda x: {k:v for k, v in x.items() if k in keys}, myDict)) 
print(l) 

輸出:

[{'last': 'Joule', 'middle': 'Smith'}, {'last': 'Watt', 'middle': 'Johnson'}, {'last': 'Doppler', 'middle': 'Edward'}, {'last': 'Antonio'}] 
+0

我只是把*鍵*轉換爲* set * - 以加快查找速度 – volcano

+3

此外,使用列表理解代替'map'看起來更清潔一些,所以只需寫[[k:v for k,v)in x.items()if k in keys} for myDict]' –

+0

順便說一句,* map *是理解的另一種形式。而且,由於在Python 3中它會生成* map * object - 這本質上是迭代器,理解將是普遍的選擇。 – volcano

1

使用的答案,如果你是neverwalkaloner只做一次。但是,如果你發現自己經常操縱字典列表,我寫了一個名爲PLOD的免費庫,可以簡化大部分這種庫。

>>> from PLOD import PLOD 
>>> l = PLOD(myDict).dropKey("middle").returnList() 
>>> l 
[{'last': 'Joule', 'first': 'James'}, {'last': 'Watt', 'first': 'James'}, {'last': 'Doppler', 'first': 'Christian'}, {'last': 'Antonio', 'first': 'Robert'}] 
>>> print(PLOD(l).returnString()) 
[ 
    {first: 'James' , last: 'Joule' }, 
    {first: 'James' , last: 'Watt' }, 
    {first: 'Christian', last: 'Doppler'}, 
    {first: 'Robert' , last: 'Antonio'} 
] 
>>> 

圖書館是PyPI上:https://pypi.python.org/pypi/PLOD

爲了更普遍地做你想做的,我需要添加一個新的類方法。也許.filterKeys。也許我會在1.8版中這樣做。然後,它會去:

>>> l = PLOD(myDict).filterKeys(['first', 'last']).returnList() 

嗯...

BTW,的lib支持Python 2.7.x現在。仍在使用3.5.x版本。