用带有子列表的字典对值进行计数

时间:2018-06-19 19:49:08

标签: python list dictionary counter

我没有被警告说这个问题经常被否决,但是我还没有看到针对我的特定问题的解决方案。

我有一本这样的字典:

d = {'a': [['I', 'said', 'that'], ['said', 'I']], 
    'b':[['she', 'is'], ['he', 'was']]}

我希望输出是一个包含原始键的字典,然后是一个包含一个值的字典,该值指示每个单词的计数(例如{'a':{'I':2, 'said':2, 'that':1}等,用b表示。

如果值在列表中而不是子列表中,则只需使用Counter即可得到所需的内容:

d2 = {'a': ['I','said','that', 'I'],'b': ['she','was','here']}
from collections import Counter
counts = {k: Counter(v) for k, v in d2.items()}

但是,我得到TypeError: unhashable type: 'list'是因为包含要计数的值的列表是子列表,并且包含它们的列表不可散列。

我还知道,如果我只有子列表,我可以通过以下方式获得想要的东西:

lst = [['I', 'said', 'that'], ['said', 'I']]
Counter(word for sublist in lst for word in sublist)

但是我只是想不出如何结合这些想法来解决我的问题(我想这在于结合这两者)。

我确实尝试过

for key, values in d.items():
    flat_list = [item for sublist in values for item in sublist]
    new_dict = {key: flat_list}
    counts = {k: Counter(v) for k, v in new_dict.items()}

但是那只给了我第二个列表的计数(因为flat_list本身仅返回第二个键的值。

3 个答案:

答案 0 :(得分:2)

要结合这两种解决方案,只需将第一个解决方案中的Counter(v)替换为第二个解决方案即可。

from collections import Counter

d = {'a': [['I', 'said', 'that'], ['said', 'I']],
     'b': [['she', 'is'], ['he', 'was']]}


counts = {k: Counter(word
                     for sublist in lst
                     for word in sublist)
          for k, lst in d.items()}

print(counts)

输出:

{'a': Counter({'I': 2, 'said': 2, 'that': 1}),
 'b': Counter({'she': 1, 'is': 1, 'he': 1, 'was': 1})}

答案 1 :(得分:0)

您可以合并子列表以获取d2:<Form functionName={myAction} />

在python3中,您需要d2 = {k: reduce(list.__add__, d[k], []) for k in d}

答案 2 :(得分:0)

为此使用SELECT COUNT (discountcode) AS discount, order_num FROM ordersdiscount HAVING COUNT (discountcode)>1 itertools模块。用itertools.chain展平嵌套列表,并用collections.Counter计数

collections

输出:

import itertools, collections
d = {
         'a': [['I', 'said', 'that'], ['said', 'I']],
         'b':[['she', 'is'], ['he', 'was']]
    }
out_dict = {}
for d_key, data in d.items():    
    counter = collections.Counter(itertools.chain(*data))
    out_dict[d_key] = counter
print out_dict