Python - 基于多个键过滤字典列表

joh*_*101 2 python dictionary list-comprehension list filter

说我有字典:

myDict = [{'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
        {'first': 'James', 'middle': 'Johnson', 'last': 'Watt'},
        {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'}
        {'first': 'Robert', 'last': 'Antonio'}]
Run Code Online (Sandbox Code Playgroud)

我有一个名为键的列表:

keys = ["middle", "last"]
Run Code Online (Sandbox Code Playgroud)

我想根据键中的每个值来过滤myDict,这会导致

filteredDict = [{'middle': 'Smith', 'last': 'Joule'},
              {'middle': 'Johnson', 'last': 'Watt'},
              {'middle': 'Edward', 'last': 'Doppler'},
              {'last': 'Antonio'}]
Run Code Online (Sandbox Code Playgroud)

如myDict列表中的列表字典中所示,字典DOESNT必须具有两个键才能放入filteredDict.在Python中使用字典理解是否有一种简单的方法可以做到这一点?

nev*_*ner 9

使用列表推导:

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]
Run Code Online (Sandbox Code Playgroud)

但你也可以使用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)
Run Code Online (Sandbox Code Playgroud)

输出:

[{'last': 'Joule', 'middle': 'Smith'}, {'last': 'Watt', 'middle': 'Johnson'}, {'last': 'Doppler', 'middle': 'Edward'}, {'last': 'Antonio'}]
Run Code Online (Sandbox Code Playgroud)

  • 此外,使用列表推导代替`map`看起来更清晰一些,所以只需在myDict中为x写入`[{k:v for(k,v)in x.items()if k in keys} for x ` (4认同)