我正在尝试在 Python 中创建一个嵌套字典,以便在给定一个字符串列表的情况下,该字典记录该字符串顺序出现的次数。
例如,如果字符串列表是:
["hey", "my", "name", "is"]
我希望嵌套字典看起来像:
{"hey": {"my": {"name": {"is": 1}}}}
我知道我可能可以使用整个列表作为键,但我特别想分隔字典中的字符串。
我也想用
defaultdict
字典来解决这个问题,而不是 Python 字典,并且最好使用递归定义的 defaultdict
。
这是我尝试过的:
from collections import defaultdict
nested_dict = lambda: defaultdict(nested_dict)
# Initialize ngrams as a nested defaultdict
ngrams = nested_dict()
# Function to update the nested defaultdict with the list of words
def update_ngrams(ngrams, words):
current_dict = ngrams
for word in words[:-1]:
current_dict = current_dict[word]
current_dict[words[-1]] += 1
# Example usage
update_ngrams(ngrams, ["My", "big", "cat"])
update_ngrams(ngrams, ["My", "big", "dog"])
但它给了我这个错误:
TypeError: unsupported operand type(s) for +=: 'collections.defaultdict' and 'int'
预期的输出应该是这样的地图:
{"My": {"big": {"cat": 1, "dog": 1}}}
这是一个仅使用标准字典的解决方案。它为除最后一层之外的每一层创建一个新字典,并在最后一层增加一个整数。
def update_ngrams(ng: dict, words: list[str]):
n = len(words)
d = ng
for i, w in enumerate(words,1):
if i == n:
d.setdefault(w, 0)
d[w] += 1
else:
d = d.setdefault(w, {})
ngrams = {}
update_ngrams(ngrams, ["My", "big", "cat"])
update_ngrams(ngrams, ["My", "big", "dog"])
ngrams
# returns:
{'My': {'big': {'cat': 1, 'dog': 1}}}
您将遇到的问题是它不处理叶(“猫”或“狗”)键也是分支的情况。即:
["My", "big", "dog", "Noodle"]
。