【问题标题】:Incrementing an element in a list of dictionaries with map and lambda使用 map 和 lambda 增加字典列表中的元素
【发布时间】:2015-11-02 14:25:32
【问题描述】:

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

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

我想将每个 a-key 的值加一。使用这样的循环很容易实现:

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

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

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

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

提前致谢!

【问题讨论】:

  • 可能不是一个好主意。如果您想要的只是改变字典的副作用,为什么还要创建一个列表?这很浪费内存。看到这个:stackoverflow.com/q/14633298/4996248
  • 为什么要在这里使用map?这个问题可以用命令式的方式很容易地解决(你的例子是for),但是使用函数式范式需要对持久数据结构的强大支持,而Python没有。简而言之:您必须复制每个字典并替换其中的一个值,而不是更改每个字典的一个值。看起来不像 Pythonic 方式
  • map(lambda x:x['a']+1 , l) 打印 l
  • 这更像是一种理论游戏,没有考虑到有用的应用程序。但是 map(lambda x:x['a']+1 , l) print l 不起作用。它仅返回更新条目的列表,即 [2, 4, 6]。我想要这样的列表: [{'a': 2, 'b': 2}, {'a': 4, 'b': 4}, {'a': 6, 'b': 6}]

标签: python dictionary lambda


【解决方案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}]

【讨论】:

  • 嗯,好吧,这基本上就像复制字典并相应地修改条目。感谢您分享这个想法。 :)
  • 注意,在 python3.x 上,map 不再使用输入可迭代直到它需要(例如,当您决定实际迭代结果时)。这可能会导致类似这样的问题。
  • @mgilson 对,您需要将其转换为列表。我加了
【解决方案2】:

我同意@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} 之类的条目,这当然行不通

【讨论】:

  • 是的,似乎所有解决方案都需要字典的结构,并假设每个字典看起来都一样。
【解决方案3】:

只要我们清楚这不是一件实际的事情,您就可以在 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 键的值已更改。不用说,这比两行 for 循环的可读性差得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2011-03-22
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2020-03-16
    相关资源
    最近更新 更多