我有一个字典列表(很像JSON)。我想将一个函数应用于列表的每个字典中的一个键。
>> d = [{'a': 2, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}]
# Desired value
[{'a': 200, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}]
# If I do this, I can only get the changed key
>> map(lambda x: {k: v * 100 for k, v in x.iteritems() if k == 'a'}, d)
[{'a': 200}, {'a': 100}, {'a': 100}, {'a': 100}]
# I try to add the non-modified key-values but get an error
>> map(lambda x: {k: v * 100 for k, v in x.iteritems() if k == 'a' else k:v}, d)
SyntaxError: invalid syntax
File "<stdin>", line 1
map(lambda x: {k: v * 100 for k, v in x.iteritems() if k == 'a' else k:v}, d)
我怎样才能做到这一点?
编辑:'a'和'b'不是唯一的关键。这些仅用于演示目的。
答案 0 :(得分:7)
遍历列表并更新所需的dict项目
lst = [{'a': 2, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}]
for d in lst:
d['a'] *= 100
使用列表理解会为您提供速度,但它会创建一个新列表和n个新词典,如果您不想改变您的列表,它会很有用,这里是
new_lst = [{**d, 'a': d['a']*100} for d in lst]
在 python 2.X 中,我们无法使用{**d}
,因此我根据custom_update
方法构建了update
,代码将为< / p>
def custom_update(d):
new_dict = dict(d)
new_dict.update({'a':d['a']*100})
return new_dict
[custom_update(d) for d in lst]
如果列表中的每个项目都要更新其他键
keys = ['a', 'b', 'a', 'b'] # keys[0] correspond to lst[0] and keys[0] correspond to lst[0], ...
for index, d in enumerate(lst):
key = keys[index]
d[key] *= 100
使用列表理解
[{**d, keys[index]: d[keys[index]] * 100} for index, d in enumerate(lst)]
在 python 2.x 中,列表理解将是
def custom_update(d, key):
new_dict = dict(d)
new_dict.update({key: d[key]*100})
return new_dict
[custom_update(d, keys[index]) for index, d in enumerate(lst)]
答案 1 :(得分:5)
您可以在理解中更好地使用内联条件(三元组):
>>> d = [{'a': 2, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}]
>>> d2 = [{k: v * 100 if k == 'a' else v for k, v in i.items()} for i in d]
>>> d2
[{'a': 200, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}]
答案 2 :(得分:1)
您的map()
电话即将开始工作,您只需更改字典理解的顺序,然后将else k:v
变为else v
:
>>> d = [{'a': 2, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}]
>>> list(map(lambda x: {k: v * 100 if k == 'a' else v for k, v in x.items()}, d))
[{'a': 200, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}]
答案 3 :(得分:0)
编辑&#34; 'a'
和'b'
不是唯一的关键。这些选择仅用于演示目的&#34;,这是一个非常简单的map
函数,仅改变'a'
的值,其余部分保留为:
map(lambda x: x.update({'a': x['a']*100}), d)
我原来的回答是:
我认为最简单和最恰当的方法是在d
中进行迭代,并利用d
中的每个项目都是具有键'a'
和{{1}的字典的事实}:
'b'
结果:
res = [{'a':e['a']*100, 'b':e['b']} for e in d]
答案 4 :(得分:0)
如果您正在使用某个功能,则可能需要提供目标键和相应的值:
d = [{'a': 2, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}, {'a': 1, 'b': 2}]
f = lambda new_val, d1, key='a': {a:b*new_val if a == key else b for a, b in d1.items()}
new_d = list(map(lambda x:f(100, x), d))
输出:
[{'a': 200, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}]