使用字典计算列表列表中的元素

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)

【讨论】:

以上是关于使用字典计算列表列表中的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何计算python字典中列表元素的平均值?

python中的函数(陆续添加)

走入计算机的第十六天(字典和合集)

按两个参数对字典列表进行分组并计算分组值

Python中的列表,元祖,集合,字典

python的序列