如何创建值为列表的词典

2024-04-26 15:05:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在《思考Python》一书中读到一段代码。此代码在inverse[val].[key]处卡住,出现错误:

'str' object has no attribute 'append''

因为inverse[val]包含一个string对象。 这里是输入字典。你知道吗

def invert_dict(d):
    inverse = dict()
    for key in d:
        val = d[key]
        if val not in inverse:
            inverse[val] = [key]
        else:
            inverse[val].append(key)
    return inverse

输入字典是{'a': 1, 'p': 1, 'r': 2, 't': 1, 'o': 1}

预期的输出是{1: ['a', 'p', 't', 'o'], 2: ['r']}

如何通过修改给定的代码块来实现这一点?你知道吗


Tags: keyno代码instring字典object错误
3条回答

试试这个:

def invert_dict(data):
    inverse = {}
    for key, value in data.items():
        if value not in inverse:
            inverse[value] = [key]
        else:
            inverse[value].append(key)
    return inverse

使用reduce的单行程序:

inverted_dict = reduce((lambda inverted_dict, key: inverted_dict.setdefault(dd[key], []).append(key) or inverted_dict), d, {})

输出:

{1: ['t', 'o', 'p', 'a'], 2: ['r']}

可以使用^{}创建列表字典。然后在迭代输入字典时附加到字典值。你知道吗

from collections import defaultdict

d_in = {'a': 1, 'p': 1, 'r': 2, 't': 1, 'o': 1}

d_out = defaultdict(list)

for k, v in d_in.items():
    d_out[v].append(k)

print(d_out)

defaultdict(<class 'list'>, {1: ['a', 'p', 't', 'o'], 2: ['r']})

可以通过dict.items同时迭代键和值来改进代码,而不是迭代键和手动提取值。另外,你的缩进是不正确的。解决这些问题后:

def invert_dict(d):
    inverse = dict()
    for key, val in d.items():
        if val not in inverse:
            inverse[val] = [key]
        else:
            inverse[val].append(key)
    return inverse

相关问题 更多 >