2010-03-05 32 views
6

Come trovare il numero totale di duplicati in una stringa? , ad esempio, se fosse j= [1,1,1,2,2,2], si troverebbero duplicati 4? Sono stato in grado di trovare il conteggio che mostra quante volte ogni singolo numero si è verificato.Contare i numeri interi in Python

risposta

17
>>> j= [1,1,1,2,2,2] 
>>> len(j) - len(set(j)) 
4 

e btw, j è una lista e non una stringa, anche se per lo scopo di questo esercizio, non ha molta importanza.

7

Sembra esserci già una risposta popolare, ma se si desidera mantenere anche i singoli duplicati, il nuovo oggetto di raccolta Counter() in Python 2.7 è perfetto per questo.

>>> from collections import Counter 

>>> j = [1,1,1,2,2,2] 

>>> Counter(j) 
Counter({1: 3, 2: 3}) 

>>> sum([i - 1 for i in c.values() if i > 1]) 
4 

>>> {k: v - 1 for k, v in c.items()} # individual dupes 
{1: 2, 2: 2} 

C'è un backport for Counter at ActiveState

+1

alcuni suggerimenti/osservazioni: Bisogna supporre che 'c = Counter (j)' viene eseguito da qualche parte. Con la tua somma, hai bisogno di Python 2.7 quindi puoi perdere '[]'. In secondo luogo, la clausola 'if' è ridondante. In terzo luogo, non ha senso costruire la lista 'c.values ​​()'. Risultato: 'sum (i - 1 per i in c.itervalues ​​())' o dopo qualche algebra, prova 'sum (c.itervalues ​​()) - len (c)'. Prova ad aggiungere un non duplicato, ad es. 3 all'ingresso. Verifica se il tuo dizionario dei singoli duplicati è davvero quello che intendi. HTH. –

+0

OK ... In primo luogo, dimmi come 'i> 1' è" ridondante "? Ho ** bisogno ** di impedire 'i <0' nel caso in cui gli interi negativi dovessero mai entrare nel ditt. Quindi il confronto avviene a prescindere. Ora considera una lista di elementi 1M, dove 999.000 sono '0' e poi dimmi che non dovrei andare avanti e impedire che' 0' aggiunga anche alla lista. "Dopo un po 'di algebra" sembra che tu mi stia dicendo che ho bisogno di impararlo, ma come ho appena detto mi piacerebbe assicurarmi che '-1000000' non appartenga alla dict, nel caso qualcosa di diverso da' Counter () 'lo modifica. – jonwd7

+0

In secondo luogo, il mio uso di 'Counter()' non richiede 2.7 di sorta poiché ho incluso un collegamento al backport. (Uso una comprensione del ditt ma può essere modificata molto rapidamente). Quindi potrei o non riuscire a "perdere il' [] '" ... Ma cosa importa *? In terzo luogo, 'itervalues' /' iteritems' era inutile per questo semplice esempio e più difficile da digitare, quindi perdonami. E infine, non ho proprio idea di cosa intendi per un non-dupe 3 ... Stamperebbe '..., 3: 0}' e quello potrebbe essere o non essere esattamente ciò che l'OP * et al * voglio accadere in quella situazione. 'i> 0' allora? – jonwd7

Problemi correlati