双重过滤器,用于Python中的字典列表

时间:2015-10-19 23:18:28

标签: python dictionary list-comprehension

我已经阅读了很多文章和论坛帖子,但还没有找到如何改进以下内容。我有一个字典列表需要以两种方式过滤。

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

非常感谢

2 个答案:

答案 0 :(得分:1)

您可以使用关键视图的类似集合的特性将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()

答案 1 :(得分:0)

我相信这样的事情可以解决问题:

page

它返回

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

给出提供的清单。