在Python中创建嵌套defaultdict

问题描述 投票:0回答:1

我正在尝试在 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}}}
python defaultdict
1个回答
0
投票

这是一个仅使用标准字典的解决方案。它为除最后一层之外的每一层创建一个新字典,并在最后一层增加一个整数。

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"]

© www.soinside.com 2019 - 2024. All rights reserved.