更新词典列表中的列表值

时间:2018-01-05 00:18:36

标签: 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 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'不是唯一的关键。这些仅用于演示目的。

5 个答案:

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