我在“ 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']}
如何通过修改给定的代码块来实现这一点?
答案 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']}