Python-基于多个键筛选字典列表

2024-05-20 17:58:31 发布

您现在位置: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的列表:

keys = ["middle", "last"]

我想根据键中的每个值筛选myDict,这将导致

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

如myDict list中的list dictionary所示,字典不必同时具有两个键才能放入filteredDict。在Python中,有没有一种简单的方法来理解字典呢?


Tags: middle字典keysmydictfirstlastsmithedward
2条回答

如果你只做一次,请使用NeverWhalkinoner的答案。但是,如果你发现自己经常操作字典列表,我已经编写了一个名为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()

嗯。。。

顺便说一下,lib现在支持Python 2.7.x。仍在开发3.5.x版本。

列表理解:

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'}]

相关问题 更多 >