순서없는 목록 에서 요소의 빈도를 찾아야 합니다.
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]
순서없는 목록 에서 요소의 빈도를 찾아야 합니다.
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]
groupby
좋습니다. 나는 불구하고, DICT 접근 대 효율성에 대해 궁금해
sum(1 for _ in group)
.
[(key, len(list(group))) for key, group in groupby(a)]
또는 {key: len(list(group)) for key, group in groupby(a)}
@buhtz
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)]
collections.Counter
의 하위 클래스입니다 dict
. 일반적인 방법과 같은 방식으로 사용할 수 있습니다. 그러나 실제로 dict을 원한다면을 사용하여 dict로 변환 할 수 dict(counter)
있습니다.
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]
{x:a.count(x) for x in set(a)}
a.count()
않습니다 전체 트래버스 각 요소에 대해 를 수행 a
하여 O (N ^ 2) 2 차 접근 방식으로 만듭니다. collections.Counter()
인 훨씬 더 효율적 이 선형 시간 (O (N))에서 계산하기 때문이다. 즉,이 접근 방식은 길이가 1000 인 목록에 대해 백만 단계를 실행하고 Counter()
, 10 ^ 12 단계를 가진 1000 단계 만 수행하고, 목록에 있는 백만 개의 항목에 대해 카운터가 10 ^ 6 만 필요한 10 ^ 6 단계 만 수행함을 의미합니다.
a.count()
완전히 사용하는 것에 대한 공포는 거기에있는 세트를 사용하는 효율성을 떨어 뜨립니다 .
모양 수를 세려면
from collections import defaultdict
appearances = defaultdict(int)
for curr in a:
appearances[curr] += 1
중복을 제거하려면
a = set(a)
Counter
여러 숫자 유형을 포함하여 사용할 수 있습니다 float
또는 Decimal
뿐만 아니라, int
.
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))
defaultdict
합니다.
b = {k:0 for k in 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]
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.
count
이 시나리오 에서는 목록을 사용하는 것이 엄청나게 비싸고 불필요합니다.
다음과 같은 방식으로 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 에서 설명서를 확인할 수 있습니다.
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]
# 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)
산출
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]))
max(d.values())
마지막 루프에서 변경되지 않습니다. 루프에서 계산하지 말고 루프 전에 계산하십시오 .
#!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()
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]
카운터를 사용하여 주파수를 생성하고 있습니다. 한 줄의 코드로 텍스트 파일 단어에서 받아쓰기
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])
더 강력하지만 강력한 라이브러리 인 NLTK를 사용하여이 작업을 수행하는 또 다른 방법입니다.
import nltk
fdist = nltk.FreqDist(a)
fdist.values()
fdist.most_common()
기록적인 기능적인 답변 :
>>> 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
). 음수가 있으면 이상한 결과가 나옵니다.
세트를 사용하여 다른 방법을 찾았습니다.
#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 = [1,1,1,1,2,2,2,2,3,3,4,5,5]
a = list(set(a))
사전을 사용하여 정렬 된 배열에서 고유 한 요소 수를 찾으려면
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)
또 다른 방법은 사전과 list.count를 사용하여 순진한 방법으로 사용하는 것입니다.
dicio = dict()
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
b = list()
c = list()
for i in a:
if i in dicio: continue
else:
dicio[i] = a.count(i)
b.append(a.count(i))
c.append(i)
print (b)
print (c)