繁体   English   中英

Python defaultdict

[英]Python defaultdict

我发现了一些我无法理解的奇怪之处。 是这样的:

from collections import defaultdict
a = defaultdict(lambda: len(a))

这只是代码的一部分,代码从未在上面定义过'a'。

问题是:

  • 是否可以按原样使用defaultdict ,而不是事先指定变量?
  • 如果可能,该代码的含义是什么?

也许最好用一个例子来解释:

>>> a = defaultdict(lambda: len(b))
>>> b = 'abcd'
>>> a[0]
4

如您所见,可以在lambda中使用b ,即使此时b尚不存在。 重要的是b在执行lambda时存在。 那时,Python 将查找名为b的变量并使用它。


另请注意,原始代码不一定使用 defaultdict 本身的长度。 它只是评估当时a 看这个例子:

>>> a = defaultdict(lambda: len(a))
>>> a['a']
0
>>> a['b']
1

到目前为止,一切都很好。 但是然后重命名一些东西:

>>> x = a
>>> a = []
>>> x['c']
0
>>> x['d']
0

现在 deaultdict 被命名为x ,但它不使用len(x) 它仍然使用len(a) 如果您将 defaultdict 发送到 function,其中a没有任何意义,则此警告可能会变得很重要。

我发现了一些我无法理解的奇怪东西。 情况是这样的:

from collections import defaultdict
a = defaultdict(lambda: len(a))

这只是代码的一部分,上面的代码从未定义过'a'。

问题是:

  • 是否可以按原样使用defaultdict ,而不是先前指定变量?
  • 如果可能,该代码的含义是什么?

你是说默认字典,当我尝试用一个键做某事但它不存在时,使用这个 lambda 作为键的初始值。 因为你的 lambda 正在使用(即字典本身)并且你说它的长度。 这意味着当您使用不在字典中的键执行操作时,字典将使用 lambda 代替,或者在这种情况下,字典的长度作为值

from collections import defaultdict
a = defaultdict(lambda: len(a))

a['one'] += 5 #here dict length is 0 so value is 0 + 5 = 5
a['two'] += 2 #jere dict length is 1 so value is 1 + 2 = 3
a['three'] += 1 #here dict length is 2 so value is 2 + 1 = 3
print(a.items())
print(a['newval']) #here newval doesnt exist so will use default value which is length of dict I.E 3

OUTPUT

dict_items([('one', 5), ('two', 3), ('three', 3)])
3

下面是defaultdict的工作原理。 假设您有一个列表字典,并且您正在为可能不存在的键设置值。 在那种情况下,你会做这样的事情:

d = dict()
if some_key not in d:
    d[some_key] = list()
d[some_key].append(some_value)

defaultdict通过传递一个可调用对象自动为您执行此操作,例如intlistset ,它将调用int() (默认值 0)、 list() (默认值空列表)和set() (默认值空分别设置)。 你的 lambda 也是一个可调用的,它返回整数,所以你将有一个带有 int 值的字典。 但是你从表达式中得到的值将取决于字典的大小。

你能做a = defaultdict(lambda: len(a))吗?

是的你可以。 lambda 直到调用时才会执行,此时它会查找名称a 比较这两种情况。

f = lambda: len(a)
a = defaultdict(f)
a[0]                  # this is when the lambda is called for the first time

但,

g = lambda: len(b)
g()                   # this will raise a NameError
b = defauldict(g)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM