如何使用带有lambda表达式的DefaultDict使默认值可更改?

时间:2015-05-20 15:54:32

标签: python lambda defaultdict

DefaultDicts是一个有用的对象,能够拥有一个可以动态创建新密钥的字典,并带有用于定义默认值的可调用函数。例如。使用str将空字符串设为默认字符串。

>>> food = defaultdict(str)
>>> food['apple']
''

您也可以使用lambda使表达式成为默认值。

>>> food = defaultdict(lambda: "No food")
>>> food['apple']
'No food'

但是,您无法将任何参数传递给此lambda函数,这会在尝试调用时导致错误,因为您无法将参数实际传递给函数。

>>> food = defaultdict(lambda x: "{} food".format(x))
>>> food['apple']

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    food['apple']
TypeError: <lambda>() takes exactly 1 argument (0 given)

即使您尝试提供参数

>>> food['apple'](12)

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    food['apple']
TypeError: <lambda>() takes exactly 1 argument (0 given)

这些lambda函数如何能够响应而不是严格的表达式?

2 个答案:

答案 0 :(得分:0)

在表达式中使用变量实际上可以避免这种情况。

>>> from collections import defaultdict
>>> baseLevel = 0
>>> food = defaultdict(lambda: baseLevel)
>>> food['banana']
0
>>> baseLevel += 10
>>> food['apple']
10
>>> food['banana']
0

默认的lambda表达式绑定到一个变量,该变量可以在不影响其已创建的其他键的情况下进行更改。当它可以绑定到仅评估何时访问非存在键的其他函数时,这尤其有用。

>>> joinTime = defaultdict(lambda: time.time())
>>> joinTime['Steven']
1432137137.774
>>> joinTime['Catherine']
1432137144.704
>>> for customer in joinTime:
    print customer, joinTime[customer]

Catherine 1432137144.7
Steven 1432137137.77

答案 1 :(得分:0)

丑陋但可能对某人有用:

class MyDefaultDict(defaultdict):
    def __init__(self, func):
        super(self.__class__, self).__init__(self._func)
        self.func = func

    def _func(self):
        return self.func(self.cur_key)
        
    def __getitem__(self, key):
        self.cur_key = key
        return super().__getitem__(self.cur_key)