2011-01-20 15 views
7

Ho una classe contenente un elenco di stringhe. Di ':Come garantire che l'elenco contenga elementi univoci?

ClassName: 
- list_of_strings 

Ho bisogno di far rispettare questo elenco di stringhe che contiene elementi unici. Sfortunatamente, non posso modificare questo list_of_strings in un altro tipo, come un set.

Nella funzione addToList(str_to_add), voglio garantire l'unicità della stringa. Come posso fare meglio questo? Sarebbe utile aggiungere la stringa aggiunta all'elenco, convertirla in un set, quindi tornare a un elenco e quindi riassegnarlo all'oggetto?

Ecco il metodo che ho bisogno di aggiornare:

def addToList(self, str_to_add): 
    self.list_of_strings.append(str_to_add) 

Grazie!

+0

* Perché * non è possibile utilizzare un set? Sembra essere il tipo di dati appropriato qui. –

+0

L'elenco può essere ordinato? Se è così, allora puoi usare una ricerca binaria. Altrimenti, sei bloccato con un algoritmo di ordine lineare, quindi la conversione in un set potrebbe essere la cosa più semplice se la velocità assoluta non è un requisito. – chrisaycock

+0

Presumibilmente vuole conservare l'ordine, oppure c'è già un codice che si aspetta un elenco ordinato piuttosto che un set. Un set ordinato o un elenco univoco è un tipo di dati ragionevole. – bnaul

risposta

21
def addToList(self, str_to_add): 
    if str_to_add not in self.list_of_strings: 
     self.list_of_strings.append(str_to_add) 
+0

Ahh ... hai ragione e questo è corretto per il problema che ho descritto. Imbarazzante, ho appena realizzato che ho descritto il mio problema in modo sbagliato e il problema che sto avendo è completamente diverso. – Cuga

1

Certamente potrebbe fare l'operazione list-to-set-to-list hai descritto, ma si potrebbe anche utilizzare l'operatore in per verificare se l'elemento è già nella lista prima di aggiungerlo.

4

O controllare la presenza della stringa nell'elenco con in oppure utilizzare uno set in parallelo che è possibile controllare e aggiungere a.

+0

Il set parallelo è un'idea interessante. – kindall

+0

Questo è probabilmente più efficiente in termini di ricerche, soprattutto se l'elenco è di grandi dimensioni. – ffledgling

0

Un modo possibile per farlo sarebbe quello di creare un set di hash e scorrere l'elenco, aggiungendo gli elementi al set; una seconda iterazione potrebbe essere utilizzata per rimuovere eventuali duplicati.

0

Forse possiamo fare in questo modo:

def addToList (self, str_to_add):

try: 
    self.list_of_strings.index(str_to_add) 
except: 
    self.list_of_strings.append(str_to_add) 

Beh, non so se è lo stesso meccanismo con if/else ancora.

Problemi correlati