Comment compter les valeurs uniques dans une liste


127

J'essaie donc de créer ce programme qui demandera à l'utilisateur une entrée et stockera les valeurs dans un tableau / une liste.
Ensuite, lorsqu'une ligne vide est entrée, elle indiquera à l'utilisateur combien de ces valeurs sont uniques.
Je construis ceci pour des raisons réelles et non comme un ensemble de problèmes.

enter: happy
enter: rofl
enter: happy
enter: mpg8
enter: Cpp
enter: Cpp
enter:
There are 4 unique words!

Mon code est le suivant:

# ask for input
ipta = raw_input("Word: ")

# create list 
uniquewords = [] 
counter = 0
uniquewords.append(ipta)

a = 0   # loop thingy
# while loop to ask for input and append in list
while ipta: 
  ipta = raw_input("Word: ")
  new_words.append(input1)
  counter = counter + 1

for p in uniquewords:

.. et c'est à peu près tout ce que j'ai obtenu jusqu'ici.
Je ne sais pas comment compter le nombre unique de mots dans une liste?
Si quelqu'un peut publier la solution pour que je puisse en tirer des leçons, ou du moins me montrer comment ce serait génial, merci!


4
pourriez-vous corriger l'indentation dans votre exemple de code, c'est important en Python!
codebox

1
Vous avez supprimé votre code au lieu de le modifier pour le rendre lisible! Avoir le code là-bas aidera beaucoup ...
hcarver

1
@codebox désolé va le faire maintenant
Joel Aqu.

Réponses:


246

De plus, utilisez collections.Counter pour refactoriser votre code:

from collections import Counter

words = ['a', 'b', 'c', 'a']

Counter(words).keys() # equals to list(set(words))
Counter(words).values() # counts the elements' frequency

Production:

['a', 'c', 'b']
[2, 1, 1]

47
Pas une réponse à la question de Joel, mais exactement ce que je cherchais, merci!
Huw Walters

Parfait. Et un œil de bœuf. Merci @Vidul
Parag Tyagi

Counter(words).values()c'est sympa. Nous supposons que le décompte est dans l'ordre de première apparition de la liste de mots? Je veux dire, je suppose que le décompte nous donnera le décompte de a, puis b, puis c, puis d ...
Monica Heddneck

2
Notez si vous voulez représenter cela comme un dict comme count_dict = {'a': 2, 'b': 1, 'c': 1}vous pouvez le fairecount_dict = dict(Counter(words).items())
Peter

219

Vous pouvez utiliser un ensemble pour supprimer les doublons, puis la fonction len pour compter les éléments de l'ensemble:

len(set(new_words))


16

Utilisez un ensemble :

words = ['a', 'b', 'c', 'a']
unique_words = set(words)             # == set(['a', 'b', 'c'])
unique_word_count = len(unique_words) # == 3

Armé de cela, votre solution pourrait être aussi simple que:

words = []
ipta = raw_input("Word: ")

while ipta:
  words.append(ipta)
  ipta = raw_input("Word: ")

unique_word_count = len(set(words))

print "There are %d unique words!" % unique_word_count

6
aa="XXYYYSBAA"
bb=dict(zip(list(aa),[list(aa).count(i) for i in list(aa)]))
print(bb)
# output:
# {'X': 2, 'Y': 3, 'S': 1, 'B': 1, 'A': 2}

1
Veuillez expliquer en quoi cela diffère des autres réponses
Akaisteph7

4

Pour ndarray, il existe une méthode numpy appelée unique :

np.unique(array_name)

Exemples:

>>> np.unique([1, 1, 2, 2, 3, 3])
array([1, 2, 3])
>>> a = np.array([[1, 1], [2, 3]])
>>> np.unique(a)
array([1, 2, 3])

Pour une série, il existe un appel de fonction value_counts () :

Series_name.value_counts()

1
ipta = raw_input("Word: ") ## asks for input
words = [] ## creates list
unique_words = set(words)

1

Bien qu'un ensemble soit le moyen le plus simple, vous pouvez également utiliser un dict et utiliser some_dict.has(key)pour remplir un dictionnaire avec uniquement des clés et des valeurs uniques.

En supposant que vous avez déjà rempli les words[]entrées de l'utilisateur, créez un dict qui mappe les mots uniques de la liste à un nombre:

word_map = {}
i = 1
for j in range(len(words)):
    if not word_map.has_key(words[j]):
        word_map[words[j]] = i
        i += 1                                                             
num_unique_words = len(new_map) # or num_unique_words = i, however you prefer

1

Autre méthode en utilisant des pandas

import pandas as pd

LIST = ["a","a","c","a","a","v","d"]
counts,values = pd.Series(LIST).value_counts().values, pd.Series(LIST).value_counts().index
df_results = pd.DataFrame(list(zip(values,counts)),columns=["value","count"])

Vous pouvez ensuite exporter les résultats dans le format de votre choix


1

Que diriez-vous:

import pandas as pd
#List with all words
words=[]

#Code for adding words
words.append('test')


#When Input equals blank:
pd.Series(words).nunique()

Il renvoie le nombre de valeurs uniques dans une liste


Bienvenue dans StackOverflow! Il semble que cette solution suppose l'utilisation de pandasframework. Il serait préférable de le mentionner dans la réponse car il peut ne pas être clair pour les autres utilisateurs.
Sergey Shubin le

0

Ce qui suit devrait fonctionner. La fonction lambda filtre les mots dupliqués.

inputs=[]
input = raw_input("Word: ").strip()
while input:
    inputs.append(input)
    input = raw_input("Word: ").strip()
uniques=reduce(lambda x,y: ((y in x) and x) or x+[y], inputs, [])
print 'There are', len(uniques), 'unique words'

0

J'utiliserais un ensemble moi-même, mais voici encore une autre façon:

uniquewords = []
while True:
    ipta = raw_input("Word: ")
    if ipta == "":
        break
    if not ipta in uniquewords:
        uniquewords.append(ipta)
print "There are", len(uniquewords), "unique words!"

0
ipta = raw_input("Word: ") ## asks for input
words = [] ## creates list

while ipta: ## while loop to ask for input and append in list
  words.append(ipta)
  ipta = raw_input("Word: ")
  words.append(ipta)
#Create a set, sets do not have repeats
unique_words = set(words)

print "There are " +  str(len(unique_words)) + " unique words!"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.