假设我们有一个这样的词典列表:
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']
没有用。有什么建议吗?
提前致谢!
答案 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循环要差得多。