【问题标题】:Applying a function to values in dict将函数应用于dict中的值
【发布时间】:2012-10-25 07:31:49
【问题描述】:

我想将一个函数应用于 dict 中的所有值并将其存储在单独的 dict 中。我只是想看看我如何使用 python 并想看看我如何重写这样的东西

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

类似

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

第一种写法当然没问题,但我想弄清楚如何改变python语法

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    如果您使用的是 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())
    

    【讨论】:

    • +1。请注意,这是创建一个新字典d2,而不是就地修改一个字典。但这几乎总是你真正想要做的。如果您确实需要更新d2,您可以随时更新d2.update({k: f(v) for k, v in d1.items()})
    • 使用 3.x,第二种方法效果很好。正是我想要的。谢谢
    • 感谢您的评论。在这种情况下,我需要创建一个新的字典,但很高兴在其他情况下知道这一点。谢谢
    • @abarnert,是否可以更新字典以将函数映射到用户指定键的值而不是所有键的值?
    【解决方案2】:

    你可以使用map:

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

    如果您不介意使用扩展程序。您还可以在toolz 库中使用valmap,它在功能上等同于使用map 解决方案:

    from toolz.dicttoolz import valmap

    d2 = valmap(f, d)
    

    如果不是为了清晰地展示方法,您还可以选择提供默认返回类,以供需要dict 以外的其他东西的人使用。

    【讨论】:

      【解决方案3】:

      字典可以嵌套在 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)
      

      【讨论】:

        【解决方案4】:
        d2 = dict((k, f(v)) for k,v in d.items())
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-18
          • 1970-01-01
          • 1970-01-01
          • 2016-04-01
          • 1970-01-01
          • 2016-08-19
          • 2016-12-30
          • 1970-01-01
          相关资源
          最近更新 更多