web-dev-qa-db-fra.com

Comment compter des valeurs uniques dans une liste

J'essaie donc de créer ce programme qui demandera à l'utilisateur de saisir et de stocker les valeurs dans un tableau/une liste.
Lorsqu'une ligne vide est entrée, elle indique à l'utilisateur combien de ces valeurs sont uniques.
Je construis cela 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 eu jusqu'à présent.
Je ne suis pas sûr de savoir 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 au moins me montrer en quoi cela serait formidable, merci!

87
Joel Aqu.

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

Sortie:

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

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

len(set(new_words))
168
codebox

Utilisez un set :

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

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

13
James Hirschorn

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

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()
2
user78692
ipta = raw_input("Word: ") ## asks for input
words = [] ## creates list
unique_words = set(words)
1
user1590499

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

En supposant que vous ayez déjà rempli words[] avec les entrées de l'utilisateur, créez un dict mappant les mots uniques de la liste sur 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
JMB
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}
0
MadJayhawk

Je voudrais utiliser un jeu moi-même, mais voici encore un autre moyen:

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
Nicola Musatti
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!"
0
Curious

Autre méthode 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

0
snat2100

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
John Wang