항목이 주어지면 파이썬의 목록에서 항목을 어떻게 계산할 수 있습니까?
답변
하나의 항목 수만 원하면 다음 count
방법을 사용하십시오 .
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
여러 항목을 세려면이 옵션을 사용 하지 마십시오 . count
루프에서 호출 하려면 모든 count
호출에 대해 목록에 대해 별도의 패스가 필요하며 이는 성능면에서 치명적일 수 있습니다. 모든 항목을 계산하거나 여러 항목을 계산 Counter
하려면 다른 답변에서 설명한대로를 사용 하십시오.
답변
Counter
Python 2.7 또는 3.x를 사용 중이고 각 요소에 대해 발생 횟수를 원하는 경우 사용하십시오 .
>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})
답변
목록에서 한 항목의 발생 수 계산
하나의 목록 항목의 발생 횟수를 계산하는 데 사용할 수 있습니다 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 ()로 모든 항목 계산
또는 도서관 Counter
에서 더 빠른 수업이 collections
있습니다.
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 timeit
t1=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]
답변
사전에서 각 항목의 발생 횟수를 얻는 다른 방법 :
dict((i, a.count(i)) for i in a)
답변
list.count(x)
x
목록에 나타나는 횟수를 반환
참조 :
http://docs.python.org/tutorial/datastructures.html#more-on-lists
답변
항목이 주어지면 파이썬의 목록에서 항목을 어떻게 계산할 수 있습니까?
예제 목록은 다음과 같습니다.
>>> 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
그리고 컬렉션이 있습니다. 목록뿐만 아니라 카운터에 iterable을 덤프 할 수 있으며 카운터는 요소 수의 데이터 구조를 유지합니다.
용법:
>>> from collections import Counter
>>> c = Counter(l)
>>> c['b']
4
카운터는 Python 사전을 기반으로하며 키는 요소이므로 키를 해시 할 수 있어야합니다. 그것들은 기본적으로 중복 요소를 허용하는 세트와 같습니다.
추가 사용 collections.Counter
카운터에서 iterables를 더하거나 뺄 수 있습니다.
>>> 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})
왜 팬더가 아닌가?
또 다른 대답은 다음과 같습니다.
팬더를 사용하지 않는 이유는 무엇입니까?
팬더는 일반적인 라이브러리이지만 표준 라이브러리에는 없습니다. 요구 사항으로 추가하는 것은 쉽지 않습니다.
이 유스 케이스에 대한 기본 솔루션은 표준 라이브러리뿐만 아니라 목록 오브젝트 자체에도 있습니다.
프로젝트에 팬더가 아직 필요하지 않은 경우이 기능에 대한 요구 사항을 만드는 것은 어리석은 일입니다.
답변
제안 된 모든 솔루션 (그리고 몇 가지 새로운 솔루션)을 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 perfplot
def 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]+1
else:
d[i] = 1
return d
def count_unsorted_list_items(items):
counts = defaultdict(int)
for item in items:
counts[item] += 1
return 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 perfplot
def 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]+1
else:
d[i] = 1
return d
def count_unsorted_list_items(items):
counts = defaultdict(int)
for item in items:
counts[item] += 1
return 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,
)