在Python中将字典的值组合在一起

时间:2014-01-02 17:11:14

标签: python

我有一本字典如下:

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

4 个答案:

答案 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)

我看到两个问题:

  1. 您使用方括号[]来定义dicts而不是花括号{}。方括号环绕列表而不是单词。

  2. 您正试图在第二个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