Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算Python列表中出现次数的最快方法_Python_List_Repeat - Fatal编程技术网

计算Python列表中出现次数的最快方法

计算Python列表中出现次数的最快方法,python,list,repeat,Python,List,Repeat,我有一个Python列表,我想知道什么是计算该列表中项目出现次数的最快方法,'1'。在我的实际案例中,这个项目可能会出现数万次,这就是为什么我想要一个快速的方法 ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10'] 哪种方法:.count或collections.Counter可能更优化 a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2'

我有一个Python列表,我想知道什么是计算该列表中项目出现次数的最快方法,
'1'
。在我的实际案例中,这个项目可能会出现数万次,这就是为什么我想要一个快速的方法

['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
哪种方法:
.count
collections.Counter
可能更优化

a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
print a.count("1")
它可能在C级别进行了大量优化

编辑:我随机生成了一个大列表

In [8]: len(a)
Out[8]: 6339347

In [9]: %timeit a.count("1")
10 loops, best of 3: 86.4 ms per loop
编辑:这可以用

在上一个计时示例中使用相同的列表

In [17]: %timeit Counter(a)['1']
1 loops, best of 3: 1.52 s per loop
我的时间安排过于简单,取决于许多不同的因素,但它为您提供了一个关于性能的好线索

这里有一些分析

In [24]: profile.run("a.count('1')")
         3 function calls in 0.091 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.091    0.091 <string>:1(<module>)
        1    0.091    0.091    0.091    0.091 {method 'count' of 'list' objects}

        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Prof
iler' objects}



In [25]: profile.run("b = Counter(a); b['1']")
         6339356 function calls in 2.143 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.143    2.143 <string>:1(<module>)
        2    0.000    0.000    0.000    0.000 _weakrefset.py:68(__contains__)
        1    0.000    0.000    0.000    0.000 abc.py:128(__instancecheck__)
        1    0.000    0.000    2.143    2.143 collections.py:407(__init__)
        1    1.788    1.788    2.143    2.143 collections.py:470(update)
        1    0.000    0.000    0.000    0.000 {getattr}
        1    0.000    0.000    0.000    0.000 {isinstance}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Prof
iler' objects}
  6339347    0.356    0.000    0.356    0.000 {method 'get' of 'dict' objects}
[24]中的
:profile.run(“a.count('1')”)
在0.091秒内进行3次函数调用
订购人:标准名称
ncalls tottime percall cumtime percall文件名:lineno(函数)
1    0.000    0.000    0.091    0.091 :1()
1 0.091 0.091 0.091 0.091{“列表”对象的方法“计数”}
1 0.000 0.000 0.000 0.000{
iler'对象}
[25]中的profile.run(“b=计数器(a);b['1']”)
2.143秒内调用6339356个函数
订购人:标准名称
ncalls tottime percall cumtime percall文件名:lineno(函数)
1    0.000    0.000    2.143    2.143 :1()
2 0.000 0.000 0.000 0.000 _weakrefset.py:68(包含uuu)
1 0.000 0.000 0.000 0.000 abc.py:128(实例检查)
1 0.000 0.000 2.143 2.143集合。py:407(初始)
1 1.788 1.788 2.143 2.143集合。py:470(更新)
1 0.000 0.000 0.000 0.000{getattr}
1 0.000 0.000 0.000 0.000{isinstance}
1 0.000 0.000 0.000 0.000{
iler'对象}
6339347 0.356 0.000 0.356 0.000{“dict”对象的“get”方法}

通过使用计数器字典,以最有效的方式计算python列表中所有元素以及最常见元素的出现次数及其出现值

如果我们的python列表是:-

l=['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
要查找python列表中每个项目的出现情况,请使用以下命令:-

\>>from collections import Counter

\>>c=Counter(l)

\>>print c

Counter({'1': 6, '2': 4, '7': 3, '10': 2})
\>>k=c.most_common()

\>>k

[('1', 6), ('2', 4), ('7', 3), ('10', 2)]
要查找python列表中出现次数最多/最多的项:-

\>>from collections import Counter

\>>c=Counter(l)

\>>print c

Counter({'1': 6, '2': 4, '7': 3, '10': 2})
\>>k=c.most_common()

\>>k

[('1', 6), ('2', 4), ('7', 3), ('10', 2)]
对于最高的一个:-

\>>k[0][1]

6
对于项目,只需使用k[0][0]

\>>k[0][0]

'1'
对于第n个最高的项目及其在列表中的出现次数,请使用以下命令:-

\>>from collections import Counter

\>>c=Counter(l)

\>>print c

Counter({'1': 6, '2': 4, '7': 3, '10': 2})
\>>k=c.most_common()

\>>k

[('1', 6), ('2', 4), ('7', 3), ('10', 2)]
**对于n=2**

\>>print k[n-1][0] # For item

2

\>>print k[n-1][1] # For value

4

您可以转换字符串中的列表,其中的元素按空格分隔,并根据要搜索的数字/字符对其进行拆分

对于大型列表,将是干净和快速的

>>>L = [2,1,1,2,1,3]
>>>strL = " ".join(str(x) for x in L)
>>>strL
2 1 1 2 1 3
>>>count=len(strL.split(" 1"))-1
>>>count
3

lambda和map函数的组合也可以完成以下工作:

list_ = ['a', 'b', 'b', 'c']
sum(map(lambda x: x=="b", list_))
:2

通过将
列表
转换为
pd.Series
,然后只需使用
.value\u counts()


列表总是按顺序排列的吗?你总是数第一个项目吗?可能重复@JoshCaswell否列表没有排序,我会数任何项目。我不确定是哪种方法:
count
还是
collections.Counter
得到了更好的优化,这就是我为什么要这么做的原因asked@prrao取决于您是否要多次执行此操作。@jamylak是的,我要多次执行此操作,用于多个项目。您认为哪种方法更优化?我想更好的选择取决于具体情况?@prrao。在这种情况下,
计数
比创建
计数器
快约20倍,但相同的
计数器
可用于以极低的额外成本检索多个不同值的计数。如果需要从同一个列表中计算20个或更多的值,则
计数器将比运行
.count()
20次效率更高。我使用的数据集为1000000个整数,其中集合的范围为100,即每个元素重复约10000次。用
计数器
代替
。计数
使我的时间减少了一半+1代表
Counter
。我正在处理一个350000个字符串(url)的列表:使用Counter不到一秒钟,我就有时间喝一杯冰沙,等待.count()完成,所以再次为Counter:+1(事实上,我正在计算每个不同的url,所以,如前所述,在这种情况下,最好使用Counter)1.我一定错过了什么。使用列表[long]数据集(包含
random.randint(0,sys.maxsize)
数字,最多50万个)`,尝试使用相同参数计算另一个
randint
.cont
计数器快约10倍(只尝试计数一次)。另外,我切换到
计数器
知道如何处理的生成器,但组合时间(生成列表/生成器+计数)有利于
列表
计数
。Python3和Python2的行为是一致的。