2012-09-05 11 views
40

Así que estoy tratando de hacer este programa que solicitará al usuario la entrada y almacenar los valores en una matriz/lista.
Luego, cuando se ingresa una línea en blanco, le indicará al usuario cuántos de esos valores son únicos.
Estoy construyendo esto por razones de la vida real y no como un problema establecido.¿Cómo cuento los valores únicos dentro de una matriz en Python?

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

Mi código es el siguiente:

# 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: 

..y eso es todo lo que he conseguido hasta ahora.
No estoy seguro de cómo contar la cantidad única de palabras en una lista?
Si alguien puede publicar la solución para que pueda aprender de ella, o al menos mostrarme cómo sería genial, ¡gracias!

+3

podrías fijar la muesca en el ejemplo de código, es importante en Python! – codebox

+0

¡Has eliminado tu código en lugar de editarlo para que sea legible! Tener el código allí ayudará mucho ... – Hbcdev

+0

@codebox lo siento ahora –

Respuesta

95

Se puede utilizar un set para eliminar duplicados, y luego la función len para contar los elementos del conjunto:

len(set(new_words)) 
13

Utilice un set:

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

Armado con esta, su solución podría ser tan simple como:

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

Lo siguiente debería funcionar. La función lambda filtra las palabras duplicadas.

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

que haría uso de un conjunto a mí mismo, pero aquí es otra manera:

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!" 
86

Además, utilizar collections.Counter refactorizar su código:

from collections import Counter 


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

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

No fue una respuesta a la pregunta de Joel, sino * exactamente * lo que estaba buscando, ¡gracias! –

+0

Perfecto. Y un ojo de buey. Gracias @Vidul –

+0

'Counter (words) .values ​​()' es bueno. ¿Asumimos que el conteo está en el orden de la primera aparición de la lista de palabras?Quiero decir, supongo que el conteo nos dará la cuenta de a, luego b, luego c, luego d ... –

0

Aunque una set es la forma más fácil, también puede usar un dict y usar some_dict.has(key) para completar un diccionario con solo claves y valores únicos.

Asumiendo que ya han poblado words[] con la entrada del usuario, crear un diccionario mapear las palabras únicas en la lista a un número:

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 
0

Para ndarray hay llamada de función única np.unique (array_name)

para la serie hay un value_counts llamada a la función() Series_name.value_counts exa()

Cuestiones relacionadas