2016-12-07 32 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版本。