有没有一种简洁的方法可以就地将函数应用于 dict 值?

时间:2021-03-26 12:11:48

标签: python dictionary

我们可以用 a = a + 1 (augmented assignments) 代替 a += 1

优点是我们不需要写两次 foo

以同样的方式,我想简化以下模式

c['d'] = some_function(c['d'])

Python 的标准库中是否有一些函数可以使这成为可能?

只是为了说明我在寻找什么:

可以写这样的东西(一次)

def apply_in_place(callable, dictionary, key):
    dictionary[key] = callable(dictionary[key])

这会让我做(在很多地方)

apply_in_place(some_function, c, 'd')

但是,我有一种感觉,标准库中肯定已经有一些东西了,例如类似于 map()

我自己找不到任何东西。

请注意:我不是询问Applying a function to values in dict

1 个答案:

答案 0 :(得分:1)

TL;DR 你不能,因为字典、函数调用和赋值在 Python 中是如何工作的。您展示的包装函数是最好的 2 个可用选项之一。阅读下面的第二种选择。


这个问题的前提有点偏离。如果它是一个整数 (+=),您也可以在 dict 值上使用 dictionary[key] += 1,另一方面,如果您想将函数应用于非-dict 值 (foo = some_callable(foo))。

换句话说,问题不在于你想将一个函数应用到一个 dict 值上,而只是你想应用一个函数。

在我看来,您有 2 种可读且非 hacky 的方法来实现这一目标:

  • 创建一个包装函数,很像您所做的,这样可以最大限度地减少重复。

  • 子类 UserDict 也将允许您通过提供接口来最小化重复:

    from collections import UserDict
    
    class MyDict(UserDict):
        def apply(self, f, key):
            # TODO sanity check if f is not callable or if key does not exist
            self[key] = f(self[key])
    
    d = MyDict({'a': 'a'})
    d.apply(str.upper, 'a')
    print(d)
    

    输出

    {'a': 'A'}
    
相关问题