需求

原字典如下:

{'1': {'type': 'A', 'id': 1},
 '2': {'type': 'B', 'id': 2},
 '3': {'type': 'C', 'id': 1},
 '4': {'type': 'D', 'id': 2},
 '5': {'type': 'D', 'id': 3}}

现在要求只保留其中'type'为'A'和'D'的元素,即处理后字典变为:

{'1': {'type': 'A', 'id': 1},
 '4': {'type': 'D', 'id': 2},
 '5': {'type': 'D', 'id': 3}}

代码为:

a = {'1': {'type': 'A', 'id': 1},
     '2': {'type': 'B', 'id': 2},
     '3': {'type': 'C', 'id': 1},
     '4': {'type': 'D', 'id': 2},
     '5': {'type': 'D', 'id': 3}}

allowed_keys = ['A', 'D']

print(dict(filter(lambda x: x[1]['type'] in allowed_keys, a.items())))

运行结果:

{'1': {'type': 'A', 'id': 1}, '4': {'type': 'D', 'id': 2}, '5': {'type': 'D', 'id': 3}}

解析

map和filter是两个非常好用的批量处理可迭代对象的函数,但这里要注意:

1.传入的iterator是dict.items()而不是dict本身

2.dict.items()返回该dict的视图对象(view objects),提供了字典实体的动态视图,这就意味着字典改变,视图也会跟着变化。

视图对象不是列表,不支持索引,可以使用 list() 来转换为列表。

我们不能对视图对象进行任何的修改,因为字典的视图对象都是只读的。

dict.items()中的单个元素是一个tuple,第一个元素是key,第二个元素是value。

3.filter()返回的对象需要通过转换为dict后才是一个dict。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐