原字典如下:
{'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。