Come contare i valori univoci all'interno di un elenco


127

Quindi sto cercando di creare questo programma che chiederà all'utente l'input e memorizzerà i valori in un array / elenco.
Quindi, quando viene inserita una riga vuota, dirà all'utente quanti di questi valori sono univoci.
Lo sto costruendo per motivi di vita reale e non come un insieme di problemi.

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

Il mio codice è il seguente:

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

..e questo è tutto quello che ho ottenuto finora.
Non sono sicuro di come contare il numero univoco di parole in un elenco?
Se qualcuno può pubblicare la soluzione in modo che io possa imparare da essa, o almeno mostrarmi come sarebbe fantastico, grazie!


4
potresti correggere il rientro nel tuo esempio di codice, è importante in Python!
codebox

1
Hai rimosso il tuo codice invece di modificarlo per renderlo leggibile! Avere il codice lì aiuterà molto ...
hcarver

1
@codebox mi dispiace farò ora
Joel Aqu.

Risposte:


246

Inoltre, utilizza collections.Counter per eseguire il refactoring del codice:

from collections import Counter

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

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

Produzione:

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

47
Non una risposta alla domanda di Joel, ma esattamente quello che stavo cercando, grazie!
Huw Walters

Perfetto. E un occhio di bue. Grazie @Vidul
Parag Tyagi

Counter(words).values()è bella. Supponiamo che il conteggio sia nell'ordine della prima apparizione dell'elenco di parole? Voglio dire, presumo che il conteggio ci darà il conteggio di a, poi b, poi c, poi d ...
Monica Heddneck

2
Nota se vuoi rappresentare questo come un dict come count_dict = {'a': 2, 'b': 1, 'c': 1}puoi farecount_dict = dict(Counter(words).items())
Peter

219

È possibile utilizzare un set per rimuovere i duplicati, quindi la funzione len per contare gli elementi nel set:

len(set(new_words))


16

Usa un set :

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

Armato di questo, la tua soluzione potrebbe essere semplice come:

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
Si prega di spiegare in che modo questo è diverso dalle altre risposte
Akaisteph7

4

Per ndarray esiste un metodo numpy chiamato unico :

np.unique(array_name)

Esempi:

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

Per una serie c'è una chiamata di funzione value_counts () :

Series_name.value_counts()

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

1

Sebbene un set sia il modo più semplice, puoi anche usare un dict e usare some_dict.has(key)per popolare un dizionario con solo chiavi e valori univoci.

Supponendo che tu abbia già compilato l' words[]input dell'utente, crea un dict mappando le parole univoche nell'elenco a un numero:

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

Altro metodo utilizzando i panda

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

Puoi quindi esportare i risultati in qualsiasi formato desideri


1

Che ne dite di:

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

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


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

Restituisce quanti valori univoci sono in un elenco


Benvenuto in StackOverflow! Sembra che questa soluzione presupponga l'utilizzo di pandasframework. Sarebbe meglio menzionarlo nella risposta in quanto potrebbe non essere chiaro per altri utenti.
Sergey Shubin

0

Quanto segue dovrebbe funzionare. La funzione lambda filtra le parole duplicate.

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

Userei un set io stesso, ma ecco ancora un altro modo:

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!"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.