基本上我正在尝试计算具有关联模式的递归数组中所需的资源总和......
这是我正在努力实现的简化示例:
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 ...
我有办法做到这一点吗?
答案 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。
当然,定期循环也是可以的。