使用map和lambda增加字典列表中的元素

时间:2015-11-02 14:25:32

标签: python dictionary lambda

假设我们有一个这样的词典列表:

l = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 5, 'b': 6}]

我想将每个a键的值递增1。使用这样的循环很容易实现:

for dictionary in l:
  dictionary['a'] += 1

但是也可以通过map和lambda的组合来做到这一点吗?它必须是这样的:

l = map(lambda x: x+1, l)

但我不知道如何在lambda中指定a-key。 lambda x['a']没有用。有什么建议吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

l = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 5, 'b': 6}]
l = map(lambda x: {'a':x['a']+1,'b':x['b']}, l)
print l #in python 3 you need convert map to list list(l)
>>>[{'a': 2, 'b': 2}, {'a': 4, 'b': 4}, {'a': 6, 'b': 6}]

答案 1 :(得分:1)

我同意@ John-Colemans认为这不是一个好主意,但你可以像这样实现它:

l = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 5, 'b': 6}]
l = map(lambda x:{'a':x['a']+1,'b':x['b']} , l) 
print l

给出:

[{'a': 2, 'b': 2}, {'a': 4, 'b': 4}, {'a': 6, 'b': 6}]

如果您获得{'a':1,'c':2}

等条目,这当然行不通

答案 2 :(得分:0)

只要我们清楚这不是一个实际的事情,你可以在Python 3中使用匿名函数来执行它,该函数返回字典理解:

l = list(map(lambda d: {k:d[k]+1 if k == 'a' else d[k] for k in d},l))

此方法适用于“a”以外的任意数量的键。

l评估为:

[{'b': 2, 'a': 2}, {'b': 4, 'a': 4}, {'b': 6, 'a': 6}]

但请注意,这是一个全新的词典列表。

如果你想让l本身保持不变并且只是改变字典,并且你不想创建一个简单的列表来丢弃它,你可以评估以下内容(这将在Python 2中有效,但是Python 3的惰性迭代器永远不会在内存中创建任何列表:

assert(all(map(lambda x: not x , map(lambda d : d.update({'a':d['a']+1}),l))))

这不会产生任何输出,但是一旦您对其进行评估,您就可以验证字典是否已被修改但是没有形成副本,并且只更改了a键的值。毋庸置疑,这比2-line for循环要差得多。