【问题标题】:Map a function to values of specified keys in dictionary将函数映射到字典中指定键的值
【发布时间】:2019-05-21 10:05:30
【问题描述】:

有没有一种方便的方法可以将函数映射到字典中的指定键?

即,给定

d = {"a": 1, "b": 2, "c": 3}

想要将一个函数(比如 f)映射到键“a”和“c”:

{"a": f(1), "b": 2, "c": f(3)}

编辑

寻找不会​​更新输入字典的方法。

【问题讨论】:

  • 我会这样做:use_f = {'a', 'b'} 然后{k: v if k not in use_f else f(v) for k, v in d.items()}
  • 谢谢,这个想法行得通。我写了一个变体:def map_at_keys(d,f,keys): return {k: f(v) if k in keys else v for k,v in d.items()}
  • 酷,乐于助人!是的,把它放到一个函数中是有意义的。

标签: python dictionary


【解决方案1】:

您可以使用字典理解:

output_dict = {k: f(v) for k, v in d.items()}

请注意,f(v) 将立即被评估(调用),其返回值将存储为字典的值。

如果你想存储函数并在以后调用它(参数已经存储)你可以使用functools.partial

from functools import partial


def f(n):
    print(n * 2)


d = {"a": 1, "b": 2, "c": 3}

output_dict = {k: partial(f, v) for k, v in d.items()}

output_dict['b']()
# 4

如果您只想映射特定键,您当然可以不使用.items,而只需覆盖这些键:

d['a'] = partial(f, d['a'])

或更广义的

keys = ('a', 'c')
for key in keys:
    d[key] = partial(f, d[key])

【讨论】:

  • 谢谢。但是,我应该在 Q 中说明这一点,我不希望输入字典更新d[key]=...,也不一定要实例化一个新变量 d2 - 例如,也许是为了检查修改后的返回值。你能修改你的答案吗?
  • @alancalvitti 所以你不想修改原来的字典,但你也不想创建一个新字典。没有第三种选择...
  • 用例是打印此选择性映射的返回值,例如 d.map_on_keys(f,["a","c"]) 或全局设置 d2 = d.map_on_keys(f,["a","c"])
猜你喜欢
  • 1970-01-01
  • 2018-12-31
  • 2020-09-06
  • 2019-11-10
  • 1970-01-01
  • 2013-01-08
  • 2021-08-02
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多