Python 更新字典列表中的列表值

Python 更新字典列表中的列表值,python,dictionary,lambda,Python,Dictionary,Lambda,我有一个字典列表(很像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

我有一个字典列表(很像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)
>d=[{'a':2,'b':2},{'a':1,'b':2},{'a':1,'b':2},{'a':1,'b':2}]
#期望值
[{'a':200,'b':2},{'a':100,'b':2},{'a':100,'b':2},{'a':100,'b':2}]
#如果我这样做,我只能换钥匙
>>映射(λx:{k:v*100表示k,x.iteritems()中的v,如果k='a'},d)
[{'a':200},{'a':100},{'a':100},{'a':100}]
#我试图添加未修改的键值,但得到一个错误
>>映射(λx:{k:v*100表示k,x.iteritems()中的v,如果k='a'else k:v},d)
SyntaxError:无效语法
文件“”,第1行
映射(λx:{k:v*100表示k,x.iteritems()中的v,如果k='a'else k:v},d)
我怎样才能做到这一点


编辑:“a”和“b”不是唯一的键。选择这些仅用于演示目的。

遍历列表并更新所需的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个新的dict,如果你不想改变列表,这是很有用的

new_lst = [{**d, 'a': d['a']*100} for d in lst]
Python2.X中,我们不能使用
{**d}
,因此我基于
update
方法构建了
custom\u update
,代码将被删除

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)]
在Python2.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)]

您可以在理解中更好的位置使用内联条件(ternaries):

>>> 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}]
您的
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}]
编辑“
'a'
'b'
不是唯一的键。选择这些键仅用于演示目的”之后,这里有一个非常简单的
映射
函数,它只更改
'a'
的值,其余的保持原样:

map(lambda x: x.update({'a': x['a']*100}), d)

我最初的回答是:

我认为最简单和最合适的方法是在
d
中迭代,并利用
d
中的每个项都是一个字典,其中包含键
'a'
'b'

res = [{'a':e['a']*100, 'b':e['b']} for e in d]
结果:

[{'a': 200, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}, {'a': 100, 'b': 2}]

如果正在使用函数,则可能需要提供目标键和相应的值:

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

我们是否要假设
a
将始终在这些字典中,如果不是,期望是什么?是的,所有字典中的键都是相同的。@drum{**d}在python2中不起作用,我更新了答案,并在更新时添加了与python 2.x兼容的代码,映射将在更新现有列表时返回列表/迭代器。虽然整洁,但我不认为它很干净。