정렬되지 않은 목록에 있는 요소의 빈도를 계산하려면 어떻게 해야 합니까?
다음과 같은 값의 순서가 매겨지지 않은 리스트가 지정됩니다.
a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]
이렇게 목록에 표시되는 각 값의 빈도를 얻으려면 어떻게 해야 합니까?
# `a` has 4 instances of `1`, 4 of `2`, 2 of `3`, 1 of `4,` 2 of `5`
b = [4, 4, 2, 1, 2] # expected output
Python 2.7(또는 그 이후)에서는 다음을 사용할 수 있습니다.
>>> import collections
>>> a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]
>>> counter = collections.Counter(a)
>>> counter
Counter({1: 4, 2: 4, 5: 2, 3: 2, 4: 1})
>>> counter.values()
dict_values([2, 4, 4, 1, 2])
>>> counter.keys()
dict_keys([5, 1, 2, 4, 3])
>>> counter.most_common(3)
[(1, 4), (2, 4), (5, 2)]
>>> dict(counter)
{5: 2, 1: 4, 2: 4, 4: 1, 3: 2}
>>> # Get the counts in order matching the original specification,
>>> # by iterating over keys in sorted order
>>> [counter[x] for x in sorted(counter.keys())]
[4, 4, 2, 1, 2]
Python 2.6 이전 버전을 사용하는 경우 여기에서 구현을 다운로드할 수 있습니다.
정렬되어 있는 는, 「」를 사용할 수 .groupby
itertools
표준 라이브러리(그렇지 않은 경우 먼저 정렬할 수 있습니다.단, O(n lg n) 시간이 걸립니다).
from itertools import groupby
a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]
[len(list(group)) for key, group in groupby(sorted(a))]
출력:
[4, 4, 2, 1, 2]
Python 2.7+는 Dictionary Concription을 도입했습니다.목록에서 사전을 빌드하면 중복된 항목을 제거할 수 있을 뿐만 아니라 카운트를 얻을 수 있습니다.
>>> 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]
보고 .collections.defaultdict
지금까지 본 내용을 추적합니다.
from collections import defaultdict
appearances = defaultdict(int)
for curr in a:
appearances[curr] += 1
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))
다음과 같이 할 수 있습니다.
import numpy as np
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
np.unique(a, return_counts=True)
출력:
(array([1, 2, 3, 4, 5]), array([4, 4, 2, 1, 2], dtype=int64))
첫 번째 배열은 값이고 두 번째 배열은 이러한 값을 가진 요소의 수입니다.
따라서 숫자가 포함된 배열만 가져오려면 다음을 사용해야 합니다.
np.unique(a, return_counts=True)[1]
또 다른 이 있습니다.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))}
결과.
format: {value: num_of_occurencies}
{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
scipy.stats.itemfreq를 사용하는 방법은 다음과 같습니다.
from scipy.stats import itemfreq
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
freq = itemfreq(a)
a = freq[:,0]
b = freq[:,1]
매뉴얼은 http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.itemfreq.html 에서 확인하실 수 있습니다.
from collections import Counter
a=["E","D","C","G","B","A","B","F","D","D","C","A","G","A","C","B","F","C","B"]
counter=Counter(a)
kk=[list(counter.keys()),list(counter.values())]
pd.DataFrame(np.array(kk).T, columns=['Letter','Count'])
seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.
목록이 있다고 가정합니다.
fruits = ['banana', 'banana', 'apple', 'banana']
이렇게 목록에 있는 각 과일이 몇 개 있는지 알 수 있습니다.
import numpy as np
(unique, counts) = np.unique(fruits, return_counts=True)
{x:y for x,y in zip(unique, counts)}
결과:
{'banana': 3, 'apple': 1}
이 답변은 더 명확합니다.
a = [1,1,1,1,2,2,2,2,3,3,3,4,4]
d = {}
for item in a:
if item in d:
d[item] = d.get(item)+1
else:
d[item] = 1
for k,v in d.items():
print(str(k)+':'+str(v))
# output
#1:4
#2:4
#3:3
#4:2
#remove dups
d = set(a)
print(d)
#{1, 2, 3, 4}
첫 번째 질문의 경우 목록을 반복하고 사전을 사용하여 요소의 존재를 추적합니다.
두 번째 질문에는 set 연산자를 사용합니다.
def frequencyDistribution(data):
return {i: data.count(i) for i in data}
print frequencyDistribution([1,2,3,4])
...
{1: 1, 2: 1, 3: 1, 4: 1} # originalNumber: count
꽤 늦었지만, 이것 또한 효과가 있을 것이고, 다른 사람들에게 도움이 될 것입니다.
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
freq_list = []
a_l = list(set(a))
for x in a_l:
freq_list.append(a.count(x))
print 'Freq',freq_list
print 'number',a_l
이걸 만들어 낼 거예요
Freq [4, 4, 2, 1, 2]
number[1, 2, 3, 4, 5]
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
# 1. Get counts and store in another list
output = []
for i in set(a):
output.append(a.count(i))
print(output)
# 2. Remove duplicates using set constructor
a = list(set(a))
print(a)
- set 컬렉션은 중복을 허용하지 않습니다.set() 컨스트럭터에 목록을 전달하면 완전히 고유한 개체를 반복할 수 있습니다.count() 함수는 목록에 있는 개체가 전달되면 정수 카운트를 반환합니다.이를 통해 빈 목록 출력에 추가하여 고유한 개체가 카운트되고 각 카운트 값이 저장됩니다.
- list() 컨스트럭터는 집합을 목록으로 변환하기 위해 사용되며 동일한 변수 a에 의해 참조됩니다.
산출량
D:\MLrec\venv\Scripts\python.exe D:/MLrec/listgroup.py
[4, 4, 2, 1, 2]
[1, 2, 3, 4, 5]
사전을 사용한 간단한 해결.
def frequency(l):
d = {}
for i in l:
if i in d.keys():
d[i] += 1
else:
d[i] = 1
for k, v in d.iteritems():
if v ==max (d.values()):
return k,d.keys()
print(frequency([10,10,10,10,20,20,20,20,40,40,50,50,30]))
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
counts = dict.fromkeys(a, 0)
for el in a: counts[el] += 1
print(counts)
# {1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
#!usr/bin/python
def frq(words):
freq = {}
for w in words:
if w in freq:
freq[w] = freq.get(w)+1
else:
freq[w] =1
return freq
fp = open("poem","r")
list = fp.read()
fp.close()
input = list.split()
print input
d = frq(input)
print "frequency of input\n: "
print d
fp1 = open("output.txt","w+")
for k,v in d.items():
fp1.write(str(k)+':'+str(v)+"\n")
fp1.close()
num=[3,2,3,5,5,3,7,6,4,6,7,2]
print ('\nelements are:\t',num)
count_dict={}
for elements in num:
count_dict[elements]=num.count(elements)
print ('\nfrequency:\t',count_dict)
from collections import OrderedDict
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
def get_count(lists):
dictionary = OrderedDict()
for val in lists:
dictionary.setdefault(val,[]).append(1)
return [sum(val) for val in dictionary.values()]
print(get_count(a))
>>>[4, 4, 2, 1, 2]
중복 제거 및 순서 유지 관리:
list(dict.fromkeys(get_count(a)))
>>>[4, 2, 1]
나는 코드 한 줄의 텍스트 파일 단어에서 freq. dict를 생성하기 위해 카운터를 사용하고 있다.
def _fileIndex(fh):
''' create a dict using Counter of a
flat list of words (re.findall(re.compile(r"[a-zA-Z]+"), lines)) in (lines in file->for lines in fh)
'''
return Counter(
[wrd.lower() for wrdList in
[words for words in
[re.findall(re.compile(r'[a-zA-Z]+'), lines) for lines in fh]]
for wrd in wrdList])
참고로 기능적인 답변은 다음과 같습니다.
>>> L = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> import functools
>>> >>> functools.reduce(lambda acc, e: [v+(i==e) for i, v in enumerate(acc,1)] if e<=len(acc) else acc+[0 for _ in range(e-len(acc)-1)]+[1], L, [])
[4, 4, 2, 1, 2]
0을 세면 더 깨끗해집니다.
>>> functools.reduce(lambda acc, e: [v+(i==e) for i, v in enumerate(acc)] if e<len(acc) else acc+[0 for _ in range(e-len(acc))]+[1], L, [])
[0, 4, 4, 2, 1, 2]
설명:
- 우리는 빈칸으로 시작한다.
acc
리스트 - 다음 요소가
e
의L
크기보다 작다acc
, 이 요소를 갱신합니다.v+(i==e)
수단v+1
만약 인덱스가i
의acc
현재 요소입니다.e
(그렇지 않으면 이전 값v
; - 다음 요소가
e
의L
의 크기보다 크거나 같다.acc
확장해야 합니다.acc
새것을 주최하다1
.
요소를 정렬할 필요가 없습니다(itertools.groupby
음수일 경우 이상한 결과를 얻을 수 있습니다.
더 무겁지만 강력한 라이브러리인 NLTK를 사용하여 이를 수행하는 또 다른 접근법입니다.
import nltk
fdist = nltk.FreqDist(a)
fdist.values()
fdist.most_common()
세트를 사용하는 다른 방법을 찾았습니다.
#ar is the list of elements
#convert ar to set to get unique elements
sock_set = set(ar)
#create dictionary of frequency of socks
sock_dict = {}
for sock in sock_set:
sock_dict[sock] = ar.count(sock)
순서가 매겨지지 않은 목록의 경우 다음을 사용해야 합니다.
[a.count(el) for el in set(a)]
출력은
[4, 4, 2, 1, 2]
사전을 사용하여 정렬된 배열에서 고유한 요소 수를 찾으려면:
def CountFrequency(my_list): # Creating an empty dictionary freq = {} for item in my_list: if (item in freq): freq[item] += 1 else: freq[item] = 1 for key, value in freq.items(): print ("% d : % d"%(key, value)) # Driver function if __name__ == "__main__": my_list = [1, 1, 1, 5, 5, 3, 1, 3, 3, 1, 4, 4, 4, 2, 2, 2, 2] CountFrequency(my_list)
출처 : GeeksforGeeks
그러나 컬렉션을 사용하지 않고 다른 알고리즘을 사용하는 다른 솔루션:
def countFreq(A):
n=len(A)
count=[0]*n # Create a new list initialized with '0'
for i in range(n):
count[A[i]]+= 1 # increase occurrence for value A[i]
return [x for x in count if x] # return non-zero count
python에 내장된 기능을 사용할 수 있습니다.
l.count(l[i])
d=[]
for i in range(len(l)):
if l[i] not in d:
d.append(l[i])
print(l.count(l[i])
위 코드는 자동으로 목록에서 중복을 제거하고 원본 목록과 목록에 있는 각 요소의 빈도를 중복 없이 인쇄합니다.
한 방에 두 마리! XD
언급URL : https://stackoverflow.com/questions/2161752/how-to-count-the-frequency-of-the-elements-in-an-unordered-list
'programing' 카테고리의 다른 글
php page html 출력을 최소화하는 방법 (0) | 2022.09.18 |
---|---|
객체 지향 Javascript 베스트 프랙티스? (0) | 2022.09.18 |
파일 작성 및 수정 날짜/시간을 얻으려면 어떻게 해야 합니까? (0) | 2022.09.18 |
2개의 .jar 파일 비교 (0) | 2022.09.18 |
Vuejs 2: img.complete 속성을 검출하는 방법 (0) | 2022.09.18 |