我有一本字典如下:
comb_dict =
['1d812hjbsa' : ['Apple', 'iPad'], '190usdnb1' : ['Amazon', 'Kindle'], 'sjdb1892': ['Apple', 'iPad'], '23ub8wh12' : ['Apple', 'iPhone'], '12ndsi01' : ['Amazon', 'Kindle'] ]
密钥是交易ID,值是公司和产品名称。我正在尝试将公司和产品组合在一起并进行统计。对于这个例子,我期望输出如下:
fin_dict=
[ ['Apple', 'iPad'] : 2, '['Amazon', 'Kindle'] : 2, ['Apple', 'iPhone', : 1 ]
我试图将数据读入一个新的字典,其键值与输入相反。但是,它没有像我预期的那样工作并抛出以下错误:
for key, value in comb_dict.items():
if fin_dict.has_key(value):
fin_dict[value] +=1
else:
fin_dict.update({value : 1})
Output
if fin_dict.has_key(value):
TypeError: unhashable type: 'list'
有人可以指出如何解决这个问题吗?
谢谢, TM
答案 0 :(得分:4)
您的词典键不能是列表,因为列表是可变的。你需要一个元组或其他不可变对象。
我建议您使用计数器执行此操作。
>>> from collections import Counter
>>> dic = {'1d812hjbsa' : ['Apple', 'iPad'], '190usdnb1' : ['Amazon', 'Kindle'], 'sjdb1892': ['Apple', 'iPad'], '23ub8wh12' : ['Apple', 'iPhone'], '12ndsi01' : ['Amazon', 'Kindle']}
>>> counter = Counter(tuple(v) for v in dic.values())
>>> dict(counter)
{('Amazon', 'Kindle'): 2, ('Apple', 'iPad'): 2, ('Apple', 'iPhone'): 1}
此外,请勿使用已弃用的has_key()
。而是使用in
关键字。例如,if value in fin_dict:
。
答案 1 :(得分:1)
错误消息告诉您出现了什么问题:您不能将列表用作字典键,因为列表不可清除。
幸运的是,您可以将其转换为可以清除的元组。请注意,在collections.Counter
。
import collections
fin = collections.Counter(tuple(i) for i in comb.values())
答案 2 :(得分:0)
发生错误,因为列表不可用。例如,您可以将列表转换为逗号分隔的字符串:
fin_dict = {}
for t in comb_dict:
hash = ",".join(comb_dict[t])
if not fin_dict.has_key(hash):
fin_dict[hash] = 1
else:
fin_dict[hash] += 1
答案 3 :(得分:0)
我看到两个问题:
您使用方括号[]来定义dicts而不是花括号{}。方括号环绕列表而不是单词。
您正试图在第二个dict(fin_dict)中使用列表作为键,这是不允许的。尝试将comb_dict值的第二个元素作为fin_dict中的唯一键引用:
comb_dict = {'1d812hjbsa' : ['Apple', 'iPad'], '190usdnb1' : ['Amazon', 'Kindle'], 'sjdb1892':['Apple', 'iPad'], '23ub8wh12' : ['Apple', 'iPhone'], '12ndsi01' : ['Amazon', 'Kindle'] }
fin_dict={'iPad': 0, 'Kindle' : 0, 'iPhone' : 0}
for key, value in comb_dict.items():
if value[1] in fin_dict:
fin_dict[value[1]] +=1
else:
print("unsupported device") # or exception handling