在Python中统计列表中元素的频率

4

假设我有以下已排序的列表:

列表1:(12,24,36)

列表2:(3,5,12,24)

列表3:(36,41,69)

我想找出整个列表中每个元素的频率。我在Python中编写了一个丑陋的模块来完成这个任务,但我想知道是否有一些库函数可以实现它。

编辑:请查看下面的代码

def find_frequency(transactions,list):
    freq = 0
    for items_transaction in transactions:
        flag = 0
        for candidate in list:
            if candidate not in items_transaction:
                flag = 1
                break
        if flag == 0:
            freq += 1
    return freq

2
你想到了什么代码?请先展示一下你的努力。 - Anand S Kumar
1
不要将“list”用作变量名 - 它是一种类型名称。 - alexanderlukanin13
你应该考虑接受@AChampion的答案。 - ajrlewis
4个回答

10

计数器做的正是我认为你想要的:

>>> from itertools import chain
>>> from collections import Counter
>>> list1, list2, list3 = [12,24,36], [3,5,12,24], [36,41,69]
>>> Counter(chain(list1, list2, list3))
Counter({3: 1, 5: 1, 12: 2, 24: 2, 36: 2, 41: 1, 69: 1})

6

对于那些搜索标题中提到的列表的人,似乎有一个简单的解决方案:

from itertools import chain
from collections import Counter
list_of_lists = [[12,24,36], [3,5,12,24], [36,41,69]]
Counter(chain.from_iterable(list_of_lists))

3

您需要将列表平铺 - 也就是将其转换为所有值的单个长序列。可以使用itertools.chain来完成此操作。

import collections, itertools
l = [[12,24,36], [3,5,12,24], [36,41,69]]
freq = collections.defaultdict(int)  # 0 by default
for x in itertools.chain.from_iterable(l):
    freq[x] += 1
print(freq)

如果你要使用collections,那么最好使用Counter :) - AChampion
@AChampion,你的Python水平比我高啊,我给你点赞了 :-) - alexanderlukanin13

0
你可以使用其他帖子中提到的方法来展开列表,然后执行类似以下的操作。
def numList(list):
        dic = {}
        for num in list:
            if num in dic.keys():
                dic[num] += 1
            else:       
                key = num
                value = 1
                dic[key] = value
        return dic

这将创建一个包含列表中所有数字及其频率的字典。字典的键是数字,对应的值是频率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接