[python] 순서가없는 목록에서 요소의 빈도를 계산하는 방법은 무엇입니까?

순서없는 목록 에서 요소의 빈도를 찾아야 합니다.

a = [1,1,1,1,2,2,2,2,3,3,4,5,5]

출력->

b = [4,4,2,1,2]

또한 중복을 제거하고 싶습니다.

a = [1,2,3,4,5]



답변

참고 :를 사용하기 전에 목록을 정렬해야합니다 groupby.

목록이 주문 목록 인 경우 패키지 groupby에서 사용할 수 있습니다 itertools.

a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
from itertools import groupby
[len(list(group)) for key, group in groupby(a)]

산출:

[4, 4, 2, 1, 2]


답변

Python 2.7 이상에서는 다음을 사용할 수 있습니다 collections.Counter.

import collections
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
counter=collections.Counter(a)
print(counter)
# Counter({1: 4, 2: 4, 3: 2, 5: 2, 4: 1})
print(counter.values())
# [4, 4, 2, 1, 2]
print(counter.keys())
# [1, 2, 3, 4, 5]
print(counter.most_common(3))
# [(1, 4), (2, 4), (3, 2)]

Python 2.6 이상을 사용하는 경우 여기에서 다운로드 할 수 있습니다 .


답변

Python 2.7+에는 사전 이해력이 도입되었습니다. 목록에서 사전을 작성하면 중복을 제거하고 개수를 얻을 수 있습니다.

>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> d = {x:a.count(x) for x in a}
>>> d
{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
>>> a, b = d.keys(), d.values()
>>> a
[1, 2, 3, 4, 5]
>>> b
[4, 4, 2, 1, 2]


답변

모양 수를 세려면

from collections import defaultdict

appearances = defaultdict(int)

for curr in a:
    appearances[curr] += 1

중복을 제거하려면

a = set(a) 


답변

Python 2.7 이상에서는 컬렉션 을 사용할 수 있습니다.

>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>>
>>> from collections import Counter
>>> c=Counter(a)
>>>
>>> c.values()
[4, 4, 2, 1, 2]
>>>
>>> c.keys()
[1, 2, 3, 4, 5]


답변

요소의 빈도를 세는 것은 사전을 사용하여 수행하는 것이 가장 좋습니다.

b = {}
for item in a:
    b[item] = b.get(item, 0) + 1

중복을 제거하려면 세트를 사용하십시오.

a = list(set(a))


답변

다음 itertools.groupby은 정렬되지 않은 입력에도 작동하는 또 다른 간결한 대안입니다 .

from itertools import groupby

items = [5, 1, 1, 2, 2, 1, 1, 2, 2, 3, 4, 3, 5]

results = {value: len(list(freq)) for value, freq in groupby(sorted(items))}

결과

{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}