[python] 목록 항목의 발생을 어떻게 계산할 수 있습니까?

항목이 주어지면 파이썬의 목록에서 항목을 어떻게 계산할 수 있습니까?



답변

하나의 항목 수만 원하면 다음 count방법을 사용하십시오 .

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

여러 항목을 세려면이 옵션을 사용 하지 마십시오 . count루프에서 호출 하려면 모든 count호출에 대해 목록에 대해 별도의 패스가 필요하며 이는 성능면에서 치명적일 수 있습니다. 모든 항목을 계산하거나 여러 항목을 계산 Counter하려면 다른 답변에서 설명한대로를 사용 하십시오.


답변

CounterPython 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,
    )