给定一个项目,我如何计算它在Python列表中的出现次数?


#1楼

如果您想一次计算所有值,可以使用numpy数组和bincount快速bincount ,如下所示

import numpy as np
a = np.array([1, 2, 3, 4, 1, 4, 1])
np.bincount(a)

这使

>>> array([0, 3, 1, 1, 2])

#2楼

计算列表中一项的出现

要仅计算一个列表项的出现次数,可以使用count()

>>> l = ["a","b","b"]
>>> l.count("a")
1
>>> l.count("b")
2

计算列表中所有项目的出现次数也称为“对列表进行计数”或创建计数计数器。

用count()计算所有项目

要计算项目在l的出现次数,只需使用列表推导和count()方法即可

[[x,l.count(x)] for x in set(l)]

(或类似地使用字典dict((x,l.count(x)) for x in set(l))

例:

>>> l = ["a","b","b"]
>>> [[x,l.count(x)] for x in set(l)]
[['a', 1], ['b', 2]]
>>> dict((x,l.count(x)) for x in set(l))
{'a': 1, 'b': 2}

用Counter()计算所有项目

另外, collections库中有更快的Counter

Counter(l)

例:

>>> l = ["a","b","b"]
>>> from collections import Counter
>>> Counter(l)
Counter({'b': 2, 'a': 1})

计数器快多少?

我检查了Counter来计算清单的速度。 我用n的几个值尝试了这两种方法,看来Counter快了约2的常数。

这是我使用的脚本:

from __future__ import print_function
import timeitt1=timeit.Timer('Counter(l)', \'import random;import string;from collections import Counter;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]')t2=timeit.Timer('[[x,l.count(x)] for x in set(l)]','import random;import string;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]')print("Counter(): ", t1.repeat(repeat=3,number=10000))
print("count():   ", t2.repeat(repeat=3,number=10000)

并输出:

Counter():  [0.46062711701961234, 0.4022796869976446, 0.3974247490405105]
count():    [7.779430688009597, 7.962715800967999, 8.420845870045014]

#3楼

如果您只想要一项的计数,请使用count方法:

>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3

如果要计数多个项目,请不要使用此选项。 循环调用count需要为每个count调用单独遍历列表,这可能会对性能造成灾难性影响。 如果您要计算所有项目,甚至只是多个项目,请使用Counter ,如其他答案中所述。


#4楼

list.count(x)返回x在列表中出现的次数

请参阅: http : //docs.python.org/tutorial/datastructures.html#more-on-lists


#5楼

给定一个项目,我如何计算它在Python列表中的出现次数?

这是一个示例列表:

>>> l = list('aaaaabbbbcccdde')
>>> l
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'e']

list.count

list.count方法

>>> l.count('b')
4

这适用于任何列表。 元组也有这种方法:

>>> t = tuple('aabbbffffff')
>>> t
('a', 'a', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'f', 'f')
>>> t.count('f')
6

collections.Counter

然后是collections.Counter。 您可以将任何可迭代的对象转储到Counter中,而不仅仅是列表,并且Counter将保留元素计数的数据结构。

用法:

>>> from collections import Counter
>>> c = Counter(l)
>>> c['b']
4

计数器基于Python字典,它们的键是元素,因此键必须是可哈希的。 它们基本上就像允许多余元素进入的集合。

collections.Counter进一步使用

您可以从计数器中添加或减去可迭代项:

>>> c.update(list('bbb'))
>>> c['b']
7
>>> c.subtract(list('bbb'))
>>> c['b']
4

您还可以使用计数器进行多组操作:

>>> c2 = Counter(list('aabbxyz'))
>>> c - c2                   # set difference
Counter({'a': 3, 'c': 3, 'b': 2, 'd': 2, 'e': 1})
>>> c + c2                   # addition of all elements
Counter({'a': 7, 'b': 6, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c | c2                   # set union
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c & c2                   # set intersection
Counter({'a': 2, 'b': 2})

为什么不熊猫呢?

另一个答案表明:

为什么不使用熊猫?

熊猫是一个公共库,但不在标准库中。 根据需要添加它并非易事。

在列表对象本身以及标准库中都有针对此用例的内置解决方案。

如果您的项目不再需要熊猫,那么仅将其作为此功能的要求是愚蠢的。


#6楼

您还可以使用内置模块operator countOf方法。

>>> import operator
>>> operator.countOf([1, 2, 3, 4, 1, 4, 1], 1)
3

#7楼

为什么不使用熊猫呢?

import pandas as pdl = ['a', 'b', 'c', 'd', 'a', 'd', 'a']# converting the list to a Series and counting the values
my_count = pd.Series(l).value_counts()
my_count

输出:

a    3
d    2
b    1
c    1
dtype: int64

如果要查找特定元素的数量,请说a ,请尝试:

my_count['a']

输出:

3

#8楼

sum([1 for elem in <yourlist> if elem==<your_value>])

这将返回your_value的出现次数


#9楼

我已经将所有建议的解决方案(以及一些新的解决方案)与perfplot (我的一个小项目)进行了比较。

盘点一件

对于足够大的阵列,事实证明

numpy.sum(numpy.array(a) == 1)

比其他解决方案快一点。

计算所有项目

像以前一样

numpy.bincount(a)

是你想要的。


复制代码的代码:

from collections import Counter
from collections import defaultdict
import numpy
import operator
import pandas
import perfplotdef counter(a):return Counter(a)def count(a):return dict((i, a.count(i)) for i in set(a))def bincount(a):return numpy.bincount(a)def pandas_value_counts(a):return pandas.Series(a).value_counts()def occur_dict(a):d = {}for i in a:if i in d:d[i] = d[i]+1else:d[i] = 1return ddef count_unsorted_list_items(items):counts = defaultdict(int)for item in items:counts[item] += 1return dict(counts)def operator_countof(a):return dict((i, operator.countOf(a, i)) for i in set(a))perfplot.show(setup=lambda n: list(numpy.random.randint(0, 100, n)),n_range=[2**k for k in range(20)],kernels=[counter, count, bincount, pandas_value_counts, occur_dict,count_unsorted_list_items, operator_countof],equality_check=None,logx=True,logy=True,)

2。

from collections import Counter
from collections import defaultdict
import numpy
import operator
import pandas
import perfplotdef counter(a):return Counter(a)def count(a):return dict((i, a.count(i)) for i in set(a))def bincount(a):return numpy.bincount(a)def pandas_value_counts(a):return pandas.Series(a).value_counts()def occur_dict(a):d = {}for i in a:if i in d:d[i] = d[i]+1else:d[i] = 1return ddef count_unsorted_list_items(items):counts = defaultdict(int)for item in items:counts[item] += 1return dict(counts)def operator_countof(a):return dict((i, operator.countOf(a, i)) for i in set(a))perfplot.show(setup=lambda n: list(numpy.random.randint(0, 100, n)),n_range=[2**k for k in range(20)],kernels=[counter, count, bincount, pandas_value_counts, occur_dict,count_unsorted_list_items, operator_countof],equality_check=None,logx=True,logy=True,)

#10楼

如果可以使用pandas ,则可以使用value_counts进行救援。

>>> import pandas as pd
>>> a = [1, 2, 3, 4, 1, 4, 1]
>>> pd.Series(a).value_counts()
1    3
4    2
3    1
2    1
dtype: int64

它还会根据频率自动对结果进行排序。

如果您希望结果在列表列表中,请执行以下操作

>>> pd.Series(a).value_counts().reset_index().values.tolist()
[[1, 3], [4, 2], [3, 1], [2, 1]]

#11楼

可能不是最有效的,需要额外的通行证才能删除重复项。

功能实现:

arr = np.array(['a','a','b','b','b','c'])
print(set(map(lambda x  : (x , list(arr).count(x)) , arr)))

返回:

{('c', 1), ('b', 3), ('a', 2)}

或按dict返回:

print(dict(map(lambda x  : (x , list(arr).count(x)) , arr)))

返回:

{'b': 3, 'c': 1, 'a': 2}

#12楼

如果您希望特定元素出现多次:

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> single_occurrences = Counter(z)
>>> print(single_occurrences.get("blue"))
3
>>> print(single_occurrences.values())
dict_values([3, 2, 1])

#13楼

def countfrequncyinarray(arr1):r=len(arr1)return {i:arr1.count(i) for i in range(1,r+1)}
arr1=[4,4,4,4]
a=countfrequncyinarray(arr1)
print(a)

#14楼

建议使用numpy的bincount ,但是它仅适用于具有非负整数的一维数组 。 而且,结果数组可能会造成混淆(它包含原始列表的从最小值到最大值的整数的出现,并将丢失的整数设置为0)。

使用numpy更好的方法是使用属性return_counts设置为True的唯一函数。 它返回一个元组,该元组具有唯一值的数组和每个唯一值的出现的数组。

# a = [1, 1, 0, 2, 1, 0, 3, 3]
a_uniq, counts = np.unique(a, return_counts=True)  # array([0, 1, 2, 3]), array([2, 3, 1, 2]

然后我们可以将它们配对为

dict(zip(a_uniq, counts))  # {0: 2, 1: 3, 2: 1, 3: 2}

它还可以与其他数据类型和“ 2d列表”一起使用,例如

>>> a = [['a', 'b', 'b', 'b'], ['a', 'c', 'c', 'a']]
>>> dict(zip(*np.unique(a, return_counts=True)))
{'a': 3, 'b': 3, 'c': 2}

#15楼

使用itertools.groupby()计数所有元素

可以通过itertools.groupby()来获取列表中所有元素的数量。

具有“重复”计数

from itertools import groupbyL = ['a', 'a', 'a', 't', 'q', 'a', 'd', 'a', 'd', 'c']  # Input listcounts = [(i, len(list(c))) for i,c in groupby(L)]      # Create value-count pairs as list of tuples
print(counts)

退货

[('a', 3), ('t', 1), ('q', 1), ('a', 1), ('d', 1), ('a', 1), ('d', 1), ('c', 1)]

通知它如何组合前三a的作为第一组,而其他基团a存在进一步在列表中向下。 发生这种情况是因为未对输入列表L进行排序。 如果组实际上应该分开,那么有时这可能是一个好处。

具有独特的计数

如果需要唯一的组计数,只需对输入列表进行排序:

counts = [(i, len(list(c))) for i,c in groupby(sorted(L))]
print(counts)

退货

[('a', 5), ('c', 1), ('d', 2), ('q', 1), ('t', 1)]

注意:groupby解决方案相比,为了创建唯一计数,许多其他答案都提供了更容易且更具可读性的代码。 但是这里显示它与重复计数示例相似。


#16楼

以下是三种解决方案:

最快的是使用for循环并将其存储在Dict中。

import time
from collections import Counterdef countElement(a):g = {}for i in a:if i in g: g[i] +=1else: g[i] =1return gz = [1,1,1,1,2,2,2,2,3,3,4,5,5,234,23,3,12,3,123,12,31,23,13,2,4,23,42,42,34,234,23,42,34,23,423,42,34,23,423,4,234,23,42,34,23,4,23,423,4,23,4]#Solution 1 - Faster
st = time.monotonic()
for i in range(1000000):b = countElement(z)
et = time.monotonic()
print(b)
print('Simple for loop and storing it in dict - Duration: {}'.format(et - st))#Solution 2 - Fast
st = time.monotonic()
for i in range(1000000):a = Counter(z)
et = time.monotonic()
print (a)
print('Using collections.Counter - Duration: {}'.format(et - st))#Solution 3 - Slow
st = time.monotonic()
for i in range(1000000):g = dict([(i, z.count(i)) for i in set(z)])
et = time.monotonic()
print(g)
print('Using list comprehension - Duration: {}'.format(et - st))

结果

 #Solution 1 - Faster 
{1: 4, 2: 5, 3: 4, 4: 6, 5: 2, 234: 3, 23: 10, 12: 2, 123: 1, 31: 1, 13: 1, 42: 5, 34: 4, 423: 3}
Simple for loop and storing it in dict - Duration: 12.032000000000153
 #Solution 2 - Fast 
Counter({23: 10, 4: 6, 2: 5, 42: 5, 1: 4, 3: 4, 34: 4, 234: 3, 423: 3, 5: 2, 12: 2, 123: 1, 31: 1, 13: 1})
Using collections.Counter - Duration: 15.889999999999418
 #Solution 3 - Slow 
{1: 4, 2: 5, 3: 4, 4: 6, 5: 2, 34: 4, 423: 3, 234: 3, 42: 5, 12: 2, 13: 1, 23: 10, 123: 1, 31: 1}
Using list comprehension - Duration: 33.0

#17楼

虽然这是一个非常古老的问题,但是由于我没有找到一支,所以我做了一支。

# original numbers in list
l = [1, 2, 2, 3, 3, 3, 4]# empty dictionary to hold pair of number and its count
d = {}# loop through all elements and store count
[ d.update( {i:d.get(i, 0)+1} ) for i in l ]print(d)

#18楼

如果您使用的是Python 2.7或3,并且希望每个元素的出现次数:

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})

#19楼

a  =[random.randint(0,100) for i in range(100)]
list(zip(set(a),[a.count(i) for i in set(a)]))

#20楼

# Python >= 2.6 (defaultdict) && < 2.7 (Counter, OrderedDict)
from collections import defaultdict
def count_unsorted_list_items(items):""":param items: iterable of hashable items to count:type items: iterable:returns: dict of counts like Py2.7 Counter:rtype: dict"""counts = defaultdict(int)for item in items:counts[item] += 1return dict(counts)# Python >= 2.2 (generators)
def count_sorted_list_items(items):""":param items: sorted iterable of items to count:type items: sorted iterable:returns: generator of (item, count) tuples:rtype: generator"""if not items:returnelif len(items) == 1:yield (items[0], 1)returnprev_item = items[0]count = 1for item in items[1:]:if prev_item == item:count += 1else:yield (prev_item, count)count = 1prev_item = itemyield (item, count)returnimport unittest
class TestListCounters(unittest.TestCase):def test_count_unsorted_list_items(self):D = (([], []),([2], [(2,1)]),([2,2], [(2,2)]),([2,2,2,2,3,3,5,5], [(2,4), (3,2), (5,2)]),)for inp, exp_outp in D:counts = count_unsorted_list_items(inp) print inp, exp_outp, countsself.assertEqual(counts, dict( exp_outp ))inp, exp_outp = UNSORTED_WIN = ([2,2,4,2], [(2,3), (4,1)])self.assertEqual(dict( exp_outp ), count_unsorted_list_items(inp) )def test_count_sorted_list_items(self):D = (([], []),([2], [(2,1)]),([2,2], [(2,2)]),([2,2,2,2,3,3,5,5], [(2,4), (3,2), (5,2)]),)for inp, exp_outp in D:counts = list( count_sorted_list_items(inp) )print inp, exp_outp, countsself.assertEqual(counts, exp_outp)inp, exp_outp = UNSORTED_FAIL = ([2,2,4,2], [(2,3), (4,1)])self.assertEqual(exp_outp, list( count_sorted_list_items(inp) ))# ... [(2,2), (4,1), (2,1)]

#21楼

计算具有共同类型的各种元素的数量:

li = ['A0','c5','A8','A2','A5','c2','A3','A9']print sum(1 for el in li if el[0]=='A' and el[1] in '01234')

3 ,而不是6


#22楼

获取字典中每个项目出现次数的另一种方法是:

dict((i, a.count(i)) for i in a)

#23楼

我今天遇到了这个问题,在考虑检查SO之前推出了自己的解决方案。 这个:

dict((i,a.count(i)) for i in a)

对于大型列表,真的非常慢。 我的解决方案

def occurDict(items):d = {}for i in items:if i in d:d[i] = d[i]+1else:d[i] = 1
return d

实际上比Counter解决方案要快一点,至少对于Python 2.7而言。

如何计算列表项的出现?相关推荐

  1. MSDN Visual系列:创建Feature扩展SharePoint列表项或文档的操作菜单项

    原文:http://msdn2.microsoft.com/en-us/library/bb418731.aspx 在SharePoint中我们可以通过创建一个包含CustomAction元素定义的F ...

  2. SharePoint REST API - 同步SharePoint列表项

    博客地址:http://blog.csdn.net/FoxDave 本篇只讲REST服务中的GetListItemChangesSinceToken这个东西.何谓同步呢,你也可以理解为增量变化,即 ...

  3. 当用户将鼠标悬停在列表项上时,使光标成为手

    我有一个列表,并且有一个用于其项目的点击处理程序: <ul><li>foo</li><li>goo</li> </ul> 如何将 ...

  4. li前面的原点或者方的样式修改html中列表项li所显示的圆点的颜色?,以及相关样式的设定...

    如何修改html中列表项li所显示的圆点的颜色?,以及相关样式的设定   这是li标签自带的圆点的颜色改变,代码如下: .centerbt li{ content:"."; col ...

  5. 【UWP】拖拽列表项的排序功能实现

    在一些允许用户自定义栏目顺序的app(如:凤凰新闻.网易云音乐等),我们可以方便地拖拽列表项来完成列表的重新排序,进而完成对栏目顺序的重排.这个功能很人性化,而实现起来其实很简单(甚至都不用写什么后台 ...

  6. FreeRTOS之列表和列表项

    一,列表是FreeRTOS中的一个数据结构,被用来跟踪FreeRTOS中的任务. 二,任务控制块中,有两个状态列表项和事件列表项 1,当前任务处于什么状态,就将该状态列表项添加到状态列表中. 2,当前 ...

  7. python 字典取值加引号创建一个对象_Python在添加到字典时从列表项中删除单引号...

    我试过类似帖子中的所有推荐,但都没有成功.我有一个用于为字典列表创建值的项列表.该列表最终将成为一个JSON对象,因此我不能在添加到其中的每个列表项周围使用单引号.在metrics = [" ...

  8. 【STM32】FreeRTOS列表和列表项详解

    00. 目录 文章目录 00. 目录 01. 概述 02. 列表 03. 列表项 04. 列表相关宏 05. 列表相关函数 5.1 初始化列表 5.2 初始化列表项 5.3 列表项插入函数 5.4 列 ...

  9. python列表间隔合并_Python使用zip合并相邻列表项的方法示例

    本文实例讲述了Python使用zip合并相邻列表项的方法.分享给大家供大家参考,具体如下: 1>使用zip()函数和iter()函数,来合并相邻的列表项 >>> x [1, 2 ...

最新文章

  1. 知乎高赞:OracleJDK和OpenJDK有什么区别?网友:不愧是大神的回答~
  2. 查找Windows文件来历的好方法
  3. 变量和指针——学习笔记
  4. OGG logdump跳过某事物操作方法
  5. java图片缩放工具类,一个JAVA图形缩放处置工具类
  6. 微信公众号发多个消息php,微擎系统微信公众号关键字触发回复多条消息实现
  7. ActiveMQ安装使用
  8. 【youcans 的 OpenCV 例程 200 篇】104. 运动模糊退化模型
  9. android onSaveInstance方法项目中的实践
  10. [转载]qt信号signal和槽slot机制
  11. 树算法系列之一:CART回归树
  12. Linux下面DNS主、辅、转、子域及其委派实验手册
  13. 百度离线地图瓦片图制作
  14. fid和is_【深度学习】生成式对抗网络(GAN)的常见评价指标:IS/FID/JS散度
  15. javascript简单介绍总结(二)
  16. 前端开发工程师,CSS盒子模型居中方法
  17. 《都挺好》苏大强,锦鲤杨超越,表情包为何会刷屏?
  18. 最热网友收藏:深入理解C语言指针的奥秘((2007年第3周)
  19. 研发高频软件,工具,网站,体验飞一般的感觉。
  20. 微型计算机原理考试试卷,微机原理试题集试题库(带答案解析)

热门文章

  1. 【SSO单点系列】(6):CAS4.0 单点流程序列图(中文版)以及相关术语解释(TGT、ST、PGT、PT、PGTIOU)...
  2. centos 下安装 mysql 5.6
  3. Jquery 提交 乱码的问题
  4. 12个有趣的C语言问答_sunyrising-ChinaUnix博客
  5. INCEPTION 编译过程报错 make[2]: * [sql/CMakeFiles/sql.dir/sql_yacc.cc.o] Error
  6. BayaiM__MySQL错误对照表
  7. 程序员初学者参考 ---懂得基础语法后如何做一个自己的case?
  8. 验证GridControl Gridview 单元格。
  9. 28 个必备的 Linux 命令行工具
  10. 对TCP/IP协议的一些看法(13):IP路由