'1'
Pythonリストがあり、このリストでアイテムの出現回数をカウントする最も簡単な方法を知りたいです。私の実際の場合、アイテムは何万回も発生する可能性があるため、迅速な方法が必要です。
['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")
おそらく経営幹部レベルで大幅に最適化されています。
編集:私はランダムに大きなリストを生成しました。
In [8]: len(a)
Out[8]: 6339347
In [9]: %timeit a.count("1")
10 loops, best of 3: 86.4 ms per loop
編集編集:これはcollections.Counterで行うことができます
a = Counter(your_list)
print a['1']
前回のタイミング例で同じリストを使用
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}
Counterディクショナリを使用して、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})
python リスト内の項目の出現頻度が最も高い/最も高いものを見つけるには:-
\>>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 番目に高い項目とその出現回数については、次のように使用します。
**n=2 の場合 **
\>>print k[n-1][0] # For item
2
\>>print k[n-1][1] # For value
4
pandas
を に変換してlist
を使用できますpd.Series
。.value_counts()
import pandas as pd
a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
a_cnts = pd.Series(a).value_counts().to_dict()
Input >> a_cnts["1"], a_cnts["10"]
Output >> (6, 2)
要素をスペースで区切った文字列のリストを変換し、検索する数値/文字に基づいて分割できます。
大きなリストの場合、クリーンで高速になります..
>>>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