¿Cómo cuento valores únicos dentro de una lista?


127

Entonces estoy tratando de hacer este programa que le pedirá al usuario que ingrese y almacene los valores en una matriz / lista.
Luego, cuando se ingrese una línea en blanco, le dirá al usuario cuántos de esos valores son únicos.
Estoy construyendo esto por razones de la vida real y no como un conjunto de problemas.

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 el número único 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!


4
¿Podrías arreglar la sangría en tu muestra de código, es importante en Python?
caja de códigos

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

1
@codebox lo siento, lo haré ahora
Joel Aqu.

Respuestas:


246

Además, use collections.Counter para 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

Salida:

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

47
No es una respuesta a la pregunta de Joel, sino exactamente lo que estaba buscando, ¡gracias!
Huw Walters

Perfecto. Y un ojo de buey. Gracias @Vidul
Parag Tyagi

Counter(words).values()es bueno. ¿Estamos asumiendo que el recuento está en el orden de aparición de la lista de palabras? Quiero decir, supongo que el recuento nos dará el recuento de a, luego b, luego c, luego d ...
Monica Heddneck

2
Tenga en cuenta si desea representar esto como un dictado como count_dict = {'a': 2, 'b': 1, 'c': 1}puede hacerlocount_dict = dict(Counter(words).items())
Peter



16

Utilice un conjunto :

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

Con esto, 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

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
Explique en qué se diferencia de las otras respuestas
Akaisteph7

4

Para ndarray hay un método numpy llamado único :

np.unique(array_name)

Ejemplos:

>>> 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])

Para una serie hay una función llamada value_counts () :

Series_name.value_counts()

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

1

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

Suponiendo que ya ha completado la words[]entrada del usuario, cree un dictado que asigne 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

1

Otro método usando 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"])

Luego puede exportar los resultados en cualquier formato que desee


1

Qué tal si:

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

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


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

Devuelve cuántos valores únicos hay en una lista.


¡Bienvenido a StackOverflow! Parece que esta solución asume el uso de pandasframework. Sería mejor mencionarlo en la respuesta, ya que puede no estar claro para otros usuarios.
Sergey Shubin

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

Yo mismo usaría un conjunto, pero aquí hay otra forma:

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!"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.