如何创建其值为列表的字典

时间:2018-07-06 08:55:27

标签: python list dictionary

我在“ Think Python”一书中读了一个代码。这段代码被卡在inverse[val].[key]上,报错:

  

'str'对象没有属性'append'

这很有意义,因为inverse[val]包含一个字符串对象。 d是输入字典。

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']}

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

4 个答案:

答案 0 :(得分:1)

您可以使用collections.defaultdict创建列表字典。然后在迭代输入字典时附加到字典值。

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

答案 1 :(得分:0)

尝试一下:

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

答案 2 :(得分:0)

使用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']}

答案 3 :(得分:0)

您还可以采用另一种方法,从字典中获取所有值,并将每个值与初始字典中具有该值的键匹配:

def invert_dict(d):
    values = set(d.values())
    inverse = dict((v,[k for k in d.keys() if d[k]==v]) for v in values)
    return inverse


inv = invert_dict({'a': 1, 'p': 1, 'r': 2, 't': 1, 'o': 1})
print(inv)

输出:

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