2012-09-05 18 views
40

Quindi sto cercando di creare questo programma che chiederà all'utente di inserire e memorizzare 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 problema.Come posso contare valori univoci all'interno di un array in Python?

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 bello, grazie!

+3

si potrebbe risolvere il rientro nel codice di esempio, è importante in Python! – codebox

+0

Hai rimosso il tuo codice anziché modificarlo per renderlo leggibile! Avere il codice ci aiuterà molto ... – Hbcdev

+0

@codebox scusa lo farò ora –

risposta

95

è possibile utilizzare un set per rimuovere i duplicati, e quindi la funzione len per contare gli elementi del set:

len(set(new_words)) 
13

Utilizzare un set:

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

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

Quanto segue dovrebbe funzionare. La funzione lambda esclude 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 me stesso, ma qui è 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!" 
86

Inoltre, utilizzare collections.Counter al 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 
+11

Non una risposta alla domanda di Joel, ma * esattamente * quello che stavo cercando, grazie! –

+0

Perfetto. E un occhio di bue. Grazie @Vidul –

+0

'Counter (words) .values ​​()' è bello. Stiamo assumendo che il conteggio sia nell'ordine della prima apparizione dell'elenco di parole?Voglio dire, sto assumendo che il conteggio ci darà il conteggio di a, poi b, poi c, poi d ... –

0

Anche se un impostare è il modo più semplice, è anche possibile utilizzare un dict e utilizzare some_dict.has(key) per popolare un dizionario con solo chiavi e valori univoci.

si Supponendo che hanno già popolato words[] con input da parte dell'utente, creare un dict mappatura delle parole uniche nella lista per 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 
0

Per ndarray v'è la funzione di chiamata unico np.unique (nome_array)

per serie c'è un value_counts chiamata di funzione() Series_name.value_counts plicarsi()

Problemi correlati