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!

Joel Aqu.
la source
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]
Vidul
la source
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))
codebox
la source
37

values, counts = np.unique(words, return_counts=True)

James Hirschorn
la source
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
Linus Thiel
la source
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}
MadJayhawk
la source
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()
user78692
la source
1
ipta = raw_input("Word: ") ## asks for input
words = [] ## creates list
unique_words = set(words)
user1590499
la source
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
JMB
la source
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

HazimoRa3d
la source
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

john_data
la source
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'
John Wang
la source
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!"
Nicola Musatti
la source
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!"
Curieuse
la source