Sıralanmamış bir listedeki öğelerin sıklığını bulmam gerekiyor
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
output->
b = [4,4,2,1,2]
Ayrıca kopyaları bir
a = [1,2,3,4,5]
Sıralanmamış bir listedeki öğelerin sıklığını bulmam gerekiyor
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
output->
b = [4,4,2,1,2]
Ayrıca kopyaları bir
a = [1,2,3,4,5]
Yanıtlar:
Not: Kullanmadan önce listeyi sıralamanız gerekir groupby
.
Sen kullanabilirsiniz groupby
gelen itertools
liste sıralı liste ise paketin.
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)]
Çıktı:
[4, 4, 2, 1, 2]
groupby
. Verimlilik yaklaşımı karşısında dict yaklaşımı merak ediyorum
sum(1 for _ in group)
.
[(key, len(list(group))) for key, group in groupby(a)]
veya {key: len(list(group)) for key, group in groupby(a)}
@buhtz
Python 2.7'de (veya daha yenisinde) şunları kullanabilirsiniz 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 veya daha eski kullanıyorsanız, bunu indirebilirsiniz burada .
collections.Counter
bir alt sınıfıdır dict
. Normal bir dikte gibi kullanabilirsiniz. Eğer gerçekten bir diksiyon istiyorsanız, bunu kullanarak bir diksiyona dönüştürebilirsiniz dict(counter)
.
Python 2.7+, Sözlük Anlama'yı sunar. Sözlüğü listeden oluşturmak, sayımın yanı sıra kopyalardan kurtulmanızı sağlar.
>>> 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()
yapar , bu da O (N ^ 2) kuadradik bir yaklaşım haline getirir. lineer zamanda (O (N)) sayıldığı için çok daha verimlidir . Sayılar, demek bu yaklaşım vs, uzunluğu 1000 bir listesi için 1.000.000 adımları çalıştırır sadece 1000 adım ile , sadece 10 ^ 6 vs. listesinde bir milyon öğeler için Sayacı tarafından ihtiyaç duyulan 10 ^ 12 adıma
collections.Counter()
Counter()
a.count()
orada bir set kullanmanın verimliliğini tamamen gölgede bırakıyor .
Görünüş sayısını saymak için:
from collections import defaultdict
appearances = defaultdict(int)
for curr in a:
appearances[curr] += 1
Kopyaları kaldırmak için:
a = set(a)
Counter
birden fazla sayısal türleri de dahil olmak üzere kullanabilir float
veya Decimal
sadece, int
.
Python 2.7+, sen kullanabilirsiniz collections.Counter öğeleri saymak
>>> 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]
Elemanların sıklığını saymak muhtemelen en iyi sözlükle yapılır:
b = {}
for item in a:
b[item] = b.get(item, 0) + 1
Kopyaları kaldırmak için bir küme kullanın:
a = list(set(a))
defaultdict
.
b = {k:0 for k in a}
?
Bunu yapabilirsiniz:
import numpy as np
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
np.unique(a, return_counts=True)
Çıktı:
(array([1, 2, 3, 4, 5]), array([4, 4, 2, 1, 2], dtype=int64))
İlk dizi değerlerdir ve ikinci dizi bu değerlere sahip öğe sayısıdır.
Yani sadece sayılarla dizi almak istiyorsanız bunu kullanmalısınız:
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
kullanılması gülünç derecede pahalıdır ve bu senaryoda bilinmemektedir.
Ben sadece scipy.stats.itemfreq aşağıdaki şekilde kullanabilirsiniz:
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]
belgeleri buradan kontrol edebilirsiniz: http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.itemfreq.html
Bu cevap daha açık
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}
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)
Çıktı
D:\MLrec\venv\Scripts\python.exe D:/MLrec/listgroup.py
[4, 4, 2, 1, 2]
[1, 2, 3, 4, 5]
Bir sözlük kullanarak basit bir çözüm.
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())
son döngüde değişmez. Döngüde hesaplamayın, döngüden önce hesaplayın .
#!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]
Yinelenenleri kaldırmak ve siparişi korumak için:
list(dict.fromkeys(get_count(a)))
>>>[4, 2, 1]
Sayaç bir frekans oluşturmak için kullanıyorum. 1 satır koddaki metin dosyası kelimelerinden alıntı
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])
Bunu yapmak için başka bir yaklaşım da, daha ağır ama güçlü bir kütüphane kullanarak - NLTK.
import nltk
fdist = nltk.FreqDist(a)
fdist.values()
fdist.most_common()
Koleksiyon kullanmadan başka bir algoritmaya sahip başka bir çözüm:
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'da sağlanan yerleşik işlevi kullanabilirsiniz
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])
Yukarıdaki kod, bir listedeki yinelemeleri otomatik olarak kaldırır ve ayrıca orijinal listedeki her bir öğenin ve yinelemesiz listenin sıklığını yazdırır.
Bir atış için iki kuş! XD
Herhangi bir kütüphane kullanmak ve basit ve kısa tutmak istemiyorsanız bu yaklaşım denenebilir!
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
marked = []
b = [(a.count(i), marked.append(i))[0] for i in a if i not in marked]
print(b)
o / p
[4, 4, 2, 1, 2]
Kayıt için işlevsel bir cevap:
>>> 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]
Sıfırları da sayarsanız daha temiz:
>>> 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]
Bir açıklama:
acc
listeyle başlıyoruz ;e
bir L
boyutundan daha düşüktür acc
, biz sadece bu eleman güncelleyin: v+(i==e)
araçları v+1
endeksi ise i
bir acc
akım unsurudur e
, aksi önceki değeri v
;e
bir L
büyüktür ya büyüklüğüne eşittir acc
, biz genişletmek zorunda acc
yeni barındırması 1
.Öğelerin sıralanması ( itertools.groupby
) gerekmez . Negatif sayılarınız varsa tuhaf sonuçlar alırsınız.
Setleri kullanarak bunu yapmanın başka bir yolunu buldum.
#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)
Listedeki benzersiz öğeleri bulmak için
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
a = list(set(a))
Sözlük kullanarak sıralanmış bir dizideki benzersiz öğelerin sayısını bulmak için
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)
Referans GeeksforGeeks
Bir başka yol da bir sözlük ve list.count, bunu yapmak için naif bir yol kullanmaktır.
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)