如何用单行操作给字典列表添加基于指定字段值的新字段?
问题描述
我有如下形式的字典列表:
[{'a': '2.1', 'z': 'apple', 'aa': 'banana'}, {'a': '4.7', 'z': 'apple', 'aa': 'banana'}, {'a': '1.6', 'z': 'apple', 'aa': 'orange'}]
希望为每个字典添加一个新字段m,其值为键aa对应值去掉首字母后的结果,最终列表如下:
[{'a': '2.1', 'z': 'apple', 'aa': 'banana', 'm':'anana'}, {'a': '4.7', 'z': 'apple', 'aa': 'banana', 'm':'anana'}, {'a': '1.6', 'z': 'apple', 'aa': 'orange', 'm':'range'}]
我已经用下面的代码实现了需求:
for x in val: x['m'] = x['aa'][1:]
请问能否通过单行操作完成此需求?
解决方案
当然可以,有几种单行实现的方式:
生成新字典列表(推荐,可读性高)
val = [dict(x, m=x['aa'][1:]) for x in val]用列表推导式遍历原列表,每个循环里用
dict()把原字典的键值对和新增的m字段合并成新字典,最后赋值回val就能得到目标结果。原地修改原字典
如果不想生成新列表,只想直接修改原字典,可以用:[x.update({'m': x['aa'][1:]}) for x in val]这里
update()方法会直接修改原字典,列表推导式只是用来循环执行操作,最后会生成一个全是None的临时列表,忽略它就行,原字典列表已经完成更新。用map函数实现
也可以结合map和匿名函数:val = list(map(lambda x: x.update({'m': x['aa'][1:]}) or x, val))因为
update()返回None,所以用or返回修改后的字典,最后转成列表得到更新后的结果。
内容的提问来源于stack exchange,提问作者imhans4305
相关产品推荐
相关产品推荐

