使用字典计算列表列表中的元素
Posted
技术标签:
【中文标题】使用字典计算列表列表中的元素【英文标题】:Counting the elements in a list of lists using a dictionary 【发布时间】:2022-01-10 18:01:49 【问题描述】:如何转换此列表列表
[['shall', 'prove'], ['shall', 'not'], ['shall', 'go'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'defend'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'never']]
放入一个字典,计算每个元素在列表中出现的次数?
即['shall', 'fight']
出现 7 次
我尝试过这样的事情
def word_counter(input_str):
counts =
for w in input_str:
counts[w] = counts.get(w, 0) + 1
items = counts.items()
word_counter([['of', 'god'], ['of', 'his'], ['of', 'her'], ['of', 'god']])
我希望输出类似于
['of', 'god']: 2, ['of', 'his']: 2, ['of', 'her']: 1
但我明白了
TypeError: unhashable type: 'list'
任何帮助将不胜感激!理想情况下,我想在基本的 Python 中做到这一点,而不需要任何额外的库等。 谢谢
【问题讨论】:
列表不能用作字典键。 如果我首先将它转换为一个元组列表,所以我有类似 [('of', 'god'), ('of', 'his'), ('of', '她'), ('of', '神')]? 【参考方案1】:您可以将列表元素转换为str
,以便将它们用作字典中的键:
def word_counter(input_lst: list[list[str]]) -> dict[str, int]:
counts: dict[str, int] =
for pair in input_lst:
pair = str(pair)
if pair in counts:
counts[pair] += 1
else:
counts[pair] = 1
return counts
# Output: "['of', 'god']": 2, "['of', 'his']": 1, "['of', 'her']": 1
print(word_counter([['of', 'god'], ['of', 'his'], ['of', 'her'], ['of', 'god']]))
如果需要,只需将它们转换回列表。
【讨论】:
【参考方案2】:列表是可变对象,它们不能被散列,因此不能用作字典中的键。您可以使用类似于列表的不可变序列的元组。此外,计数已经在标准库的 collections
模块中的 python 中实现(您不必安装任何额外的库)。这是一个例子:
import collections
original = [('shall', 'prove'), ('shall', 'not'), ('shall', 'go'), ('shall', 'fight'),
('shall', 'fight'), ('shall', 'fight'), ('shall', 'defend'), ('shall', 'fight'),
('shall', 'fight'), ('shall', 'fight'), ('shall', 'fight'), ('shall', 'never')]
counts = collections.Counter(original)
# counts is a Counter object which is a subclass of dict, but
# if you want a normal dict add the line below
counts_as_dict = dict(counts)
【讨论】:
以上是关于使用字典计算列表列表中的元素的主要内容,如果未能解决你的问题,请参考以下文章