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]
142
demandé sur Flimzy 2010-01-29 15:08:20

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]
96
répondu Nadia Alramli 2010-01-29 12:18:39

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.

388
répondu unutbu 2017-11-15 22:21:49

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]
86
répondu Amjith 2012-03-16 20:44:01

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) 
41
répondu Idan K 2010-01-29 12:16:03

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))
18
répondu lindelof 2010-01-29 12:21:30

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]
18
répondu YOU 2010-01-29 13:00:53
seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.
7
répondu Lakshman Prasad 2010-01-29 12:24:18

, 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]
6
répondu Evgenii Pavlov 2017-07-23 18:17:54
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'])
5
répondu Anirban Lahiri 2017-12-27 22:19:27

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

4
répondu 2016-01-30 18:35:39

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.

3
répondu t3rse 2010-01-29 12:10:59

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}
3
répondu Corey Richey 2015-06-30 18:39:12
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
3
répondu user2422819 2016-12-06 16:50:55
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]
1
répondu Pradam 2018-01-26 09:26:04

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])
1
répondu roberto 2018-01-27 09:37:28
#!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()
0
répondu amrutha 2015-07-10 09:31:01

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
0
répondu Reza Abtin 2015-12-20 08:17:38
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)
0
répondu chandan anand 2017-09-03 18:43:08

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

0
répondu Varun Shaandhesh 2017-10-30 14:49:28

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]
0
répondu Namrata Tolani 2017-12-06 18:44:18
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
0
répondu AMITH M S 2018-02-21 03:04:25

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)
-1
répondu Valquiria F. Pereira 2017-04-19 19:25:36
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
-2
répondu Osama Zahid 2017-02-22 02:18:26