Comment compter la fréquence des éléments dans une liste?
J'ai besoin de trouver la fréquence des éléments dans une liste
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
Sortie->
b = [4,4,2,1,2]
Aussi je veux supprimer les doublons d'un
a = [1,2,3,4,5]
23 réponses
Car la liste est ordonnée, vous pouvez faire ceci:
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)]
Sortie:
[4, 4, 2, 1, 2]
Dans Python 2.7 (ou plus récent), vous pouvez utiliser 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)]
Si vous utilisez Python 2.6 ou plus, vous pouvez le télécharger ici.
Python 2.7 + introduit la compréhension du dictionnaire. Construire le dictionnaire à partir de la liste vous permettra d'obtenir le nombre ainsi que de vous débarrasser des doublons.
>>> 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]
Pour compter le nombre d'apparitions:
from collections import defaultdict
appearances = defaultdict(int)
for curr in a:
appearances[curr] += 1
Pour supprimer les doublons:
a = set(a)
Compter la fréquence des éléments est probablement mieux fait avec un dictionnaire:
b = {}
for item in a:
b[item] = b.get(item, 0) + 1
Pour supprimer les doublons, utilisez un set:
a = list(set(a))
Dans Python 2.7+, vous pouvez utiliser collections.Compteur pour compter les éléments
>>> 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]
seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.
, Vous pouvez faire ceci:
import numpy as np
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
np.unique(a, return_counts=True)
Sortie:
(array([1, 2, 3, 4, 5]), array([4, 4, 2, 1, 2], dtype=int64))
, Le premier tableau est une des valeurs, et le second tableau est le nombre d'éléments avec ces valeurs.
Donc, si vous voulez obtenir juste un tableau avec les nombres, vous devriez utiliser ceci:
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'])
Je voudrais simplement utiliser scipy.statistique.itemfreq de la manière suivante:
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]
, Vous pouvez consulter la documentation ici: http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.itemfreq.html
Pour votre première question, itérez la liste et utilisez un dictionnaire pour garder une trace d'un élément existsence.
Pour votre deuxième question, utilisez simplement l'opérateur set.
Cette réponse est plus explicite
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
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]
Pour supprimer les doublons et maintenir l'ordre:
list(dict.fromkeys(get_count(a)))
>>>[4, 2, 1]
J'utilise Counter pour générer un freq. dict à partir de mots de fichier texte dans 1 ligne de code
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])
#!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()
Encore une autre solution avec un autre algorithme sans utiliser de collections:
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
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)
Vous pouvez utiliser la fonction en 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])
Le code ci-dessus supprime automatiquement les doublons dans une liste et imprime également la fréquence de chaque élément dans la liste et la liste sans doublons.
Deux oiseaux pour un coup ! X D
Cette approche peut être essayée si vous ne voulez utiliser aucune bibliothèque et rester simple et court!
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]
a=[1,2,3,4,5,1,2,3]
b=[0,0,0,0,0,0,0]
for i in range(0,len(a)):
b[a[i]]+=1
Encore Une façon est d'utiliser un dictionnaire et la liste.comptez, ci-dessous une façon naïve de le faire.
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)
str1='the cat sat on the hat hat'
list1=str1.split();
list2=str1.split();
count=0;
m=[];
for i in range(len(list1)):
t=list1.pop(0);
print t
for j in range(len(list2)):
if(t==list2[j]):
count=count+1;
print count
m.append(count)
print m
count=0;
#print m