¿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!

Joel Aqu.
fuente
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]
Vidul
fuente
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
219

Puede usar un conjunto para eliminar duplicados, y luego la función len para contar los elementos del conjunto:

len(set(new_words))
caja de códigos
fuente
37

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

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

HazimoRa3d
fuente
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.

john_data
fuente
¡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'
John Wang
fuente
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!"
Nicola Musatti
fuente
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!"
Curioso
fuente