如何获得字典理解的“自我”?

时间:2017-11-21 19:59:56

标签: python-3.x

基本上我正在尝试计算具有关联模式的递归数组中所需的资源总和......

这是我正在努力实现的简化示例:

import re 
with open(dictionarydata) as f: 
for line in f: 
for word in re.findall(r'\w+', line): 
print(word)

现在当然上面的代码不起作用,因为resources = { resource: resources.get( resource, 0 )+1 for resource in generator } 是不可解析的,但是我想要在创建它时访问dict ... 我有办法做到这一点吗?

1 个答案:

答案 0 :(得分:0)

这是一个古老的问题。答案是:您不能(或者如果可以,则不应该)。

但是您的想法有一个缺陷(这就是我编写此答案的原因):您使用的工具错误。我说的不是collections.Counter,而是功能性工具。列表推导是:

  

某些编程语言中可用的语法构造,用于基于现有列表创建列表。 Wikipedia

在这里,您要基于现有列表和列表的当前状态创建一个列表。从定义上讲,这不是本书的列表理解。

但是还有另一种功能结构非常适合这种情况:折叠。折叠:

  

通过使用给定的合并操作,重组递归处理其组成部分的结果,建立返回值Wikipedia

在Python中,您必须使用reduce模块的functools函数:

>>> generator = (i%7 for i in range(20))
>>> import functools
>>> functools.reduce(lambda resources, resource: {**resources, resource: resources.get(resource, 0) + 1}, generator, {})
{0: 3, 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 2}

合并功能采用当前字典,并将与resource关联的值替换为先前的值+ 1。

当然,定期循环也是可以的。