统计两个列表中的频率,Python

4

我刚开始学习Python编程,所以请忍受我这个新手的问题...

我有一个起始列表(list1),我已经去除了其中的重复项,并得到了一个仅包含每个值的一个副本的列表(list2):

list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16],

list2 = [13, 19, 2, 16, 6, 5, 20, 21]

我想要的是计算“list2”中的每个值在“list1”中出现的次数,但我无法弄清楚如何做到这一点而不出错。

我希望得到的输出类似于:

数字13在list1中出现了1次。......数字16在list1中出现了2次。


这篇文章可能是一个不错的起点 https://dev59.com/83E85IYBdhLWcg3wzm5p - Alexander Morley
6个回答

6
visited = []
for i in list2:
  if i not in visited:
    print "Number", i, "is presented", list1.count(i), "times in list1"
    visited.append(i)

6

最简单的方法是使用计数器:

from collections import Counter
list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16]
c = Counter(list1)
print(c)

给予
Counter({2: 1, 5: 1, 6: 1, 13: 4, 16: 2, 19: 3, 20: 2, 21: 1})

因此,您可以使用与访问字典相同的语法访问表示项目及其出现次数的计数器的键值对:

for k, v in c.items():
    print('- Element {} has {} occurrences'.format(k, v))

提供:

- Element 16 has 2 occurrences
- Element 2 has 1 occurrences
- Element 19 has 3 occurrences
- Element 20 has 2 occurrences
- Element 5 has 1 occurrences
- Element 6 has 1 occurrences
- Element 13 has 4 occurrences
- Element 21 has 1 occurrences

1

最简单最易懂无魔法的方法是创建一个对象(关联数组),并仅计算list1中的数字:

list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16]

frequency_list = {}

for l in list1:
    if l in frequency_list:
        frequency_list[l] += 1
    else:
        frequency_list[l] = 1

print(frequency_list)

打印出以下内容:
{
    16: 2,
    2: 1,
    19: 3,
    20: 2,
    5: 1,
    6: 1,
    13: 4,
    21: 1
}

意思是16出现了两次,2出现了一次...

一个更加简洁的版本是 for item in list1: frequency_list[item] = frequency_list.get(item, 0) + 1。我不知道你是否认为这很“神奇”,但我实际上更喜欢它来编写干净的代码。我想这需要更多的理解,所以可能只是个人观点 :) - roganjosh
@roganjosh:不错。我只是觉得一个新手问题需要一个新手答案;-) - Martin Gottweis
1
多有趣啊。我在 Hettinger 的视频 中看到了我的建议,并开始使用它,大约在24:25的时间点。我决定进行测试,你的方法始终比我的快得多,差距相当明显... - roganjosh

1

您不需要删除重复项。当您向字典中添加内容时,自动将重复项视为单个值。

list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16]
counts = {s:list1.count(s) for s in list1}
print counts

{2: 1, 5: 1, 6: 1, 13: 4, 16: 2, 19: 3, 20: 2, 21: 1}

0

你也可以使用运算符

>>> list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16],
>>> list2 = [13, 19, 2, 16, 6, 5, 20, 21]

>>> import operator
>>> for s in list2:
...    print s, 'appearing in :',  operator.countOf(list1, s)

0
在技术术语中,list是一种“对象”的“类型”。Python有许多内置类型,如字符串(str)、整数(int)和其他一些可以在Google上轻松找到的类型。这很重要的原因是每种对象类型都有自己的“方法”。您可以将这些方法视为完成常见编程任务并使您的生活更轻松的函数。

计算列表中出现次数是一个常见的编程任务示例。我们可以使用count()方法来完成它。例如,要计算13在list1中出现的次数:

count_13 = list1.count(13)

我们也可以使用for循环来遍历整个列表:
for x in list2:
    print(list1.count(x)) #This is for python version 3 and up

或者对于早于3版本的Python:

for x in list2:
    print list1.count(x)

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