将函数应用于字典中的值

79
我想对字典中的所有值应用一个函数,并将其存储在一个单独的字典中。我只是想尝试一下如何使用Python,并想看看如何重写类似于这样的东西。
for i in d:
    d2[i] = f(d[i])

变成类似于

d2[i] = f(d[i]) for i in d

第一种写法当然没问题,但我正在尝试弄清楚Python语法可以如何改变

4个回答

118

如果您正在使用Python 2.7或3.x:

d2 = {k: f(v) for k, v in d1.items()}

相当于:

d2 = {}
for k, v in d1.items():
    d2[k] = f(v)

否则:

d2 = dict((k, f(v)) for k, v in d1.items())

32
请注意,这里创建了一个新的字典 d2,而不是直接修改原有字典。但这通常是您实际想要做的。如果您确实需要直接在原有字典上进行更新,则可以使用 d2.update({k: f(v) for k, v in d1.items()}) - abarnert
使用3.x版本,第二种方法非常好用。正是我所需要的。谢谢。 - chrise
谢谢你的评论abarnert。在这种情况下,我需要创建一个新的字典,但对于其他情况了解这一点很好。谢谢。 - chrise
@abarnert,是否可以更新字典,将函数映射到用户指定键的值而不是所有键的值? - alancalvitti

9

你可以使用map

d2 = dict(d, map(f, d.values()))

如果你不介意使用扩展,你也可以使用valmaptoolz库中, 它与使用map解决方案具有相同的功能等效性: < p > < code > from toolz.dicttoolz import valmap

d2 = valmap(f, d)

如果您不需要这个方法的简洁呈现,您还可以选择提供一个默认的返回类,以供那些需要除 dict 以外的其他东西的人使用。


6
d2 = dict((k, f(v)) for k,v in d.items())

5

在Python中,字典可以嵌套,但这种情况下,解决方案d2 = {k: f(v) for k, v in d1.items()}无法使用。

对于嵌套的字典,需要一些函数遍历整个数据结构。例如,如果允许值本身是字典,则可以定义一个函数:

def myfun(d):
  for k, v in d.iteritems():
    if isinstance(v, dict):
      d[k] = myfun(v)
    else:
      d[k] = f(v)
  return d

然后。
d2 = myfun(d)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接