我没有被警告说这个问题经常被否决,但是我还没有看到针对我的特定问题的解决方案。
我有一本这样的字典:
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本身仅返回第二个键的值。
答案 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