【发布时间】:2020-02-18 06:45:06
【问题描述】:
我正在编写一段代码,这是我第一次从collections 实现defaultdict。
目前,我有一段代码可以作为defaultdict 正常工作,但我真的很想嵌套我的字典。
这是我目前拥有的代码:
from collections import defaultdict, Counter
from re import findall
class Class:
def __init__(self, n, file):
self.counts = defaultdict(lambda: defaultdict(int))
self.__n = n
self.__file = file
def function(self, starting_text, charas):
self.__starting_text = starting_text
self.__charas = charas
with open(self.__file) as file:
text = file.read().lower().replace('\n', ' ')
ngrams = [text[i : i + self.__n] for i in range(len(text))]
out = self.counts
for item in ngrams:
data = []
for word in findall( item+".", text):
data.append(word[-1])
self.counts = { item : data.count(item) for item in data }
out[item] = self.counts
self.counts = out
代码中的某些内容尚未实现,因为我处于停顿状态,因此请忽略任何不适用于此特定问题的内容!
如果我最后运行print(self.counts),我的程序会运行如下所示的内容:
defaultdict(<function Class.__init__.<locals>.<lambda> at 0x7f8c4a94bea0>, {'t': {'h': 1, ' ': 1, 'e': 1}, 'h': {'i': 1, 'o': 1}, 'i': {'s': 2}, 's': {' ': 2, 'h': 1, 'e': 1}, ' ': {'i': 1, 'a': 1, 's': 2}, 'a': {' ': 1}, 'o': {'r': 1}, 'r': {'t': 1}, 'e': {'n': 2, ' ': 1}, 'n': {'t': 1, 'c': 1}, 'c': {'e': 1}})
这太棒了!但我真的很想让那些 inner 字典也成为默认字典。特别是,如果我运行self.counts['t']['h'],我得到1,正如预期的那样。
但是,defaultdict 的一个好处是如果密钥不可用,它会为您提供0。目前,如果我运行self.counts['t']['x'],我会得到一个keyerror,但我会得到0,而不是让每个内部列表也成为一个defaultdict。
我假设这可以在以out=self.counts 开头的代码块中的某处完成,但我有点不确定如何实现这一点。
【问题讨论】:
-
您应该提供一个最小的可重现示例,这不是:stackoverflow.com/help/minimal-reproducible-example
-
我不明白你在做什么。在您的 Class 构造函数中 - 请想一个更好的名称 - 您将 self.counts 初始化为默认字典,其每个值也将是默认字典。这就是你说你想做的(内部字典是默认字典),而且它似乎已经完成了。但是在功能上——请想一个更好的名字——你将其他一些对象分配给相同的 self.counts。这些分配之一实际上是在一个循环内。这几乎肯定不是你想要的。
标签: python python-3.x dictionary defaultdict