2014-05-05 3 views
5

Ho bisogno di aiuto per restituire parole univoche (senza distinzione tra maiuscole e minuscole) da un elenco ordinato.Python restituisce parole univoche da un elenco (senza distinzione tra maiuscole e minuscole)

Ad esempio:

def case_insensitive_unique_list(["We", "are", "one", "we", "are", "the", "world", "we", "are", "THE", "UNIVERSE"]) 

tornerà: [ "Noi", "siamo", "uno", "il", "mondo", "universo"]

Finora questo è quello che ho:

def case_insensitive_unique_list(list_string): 

uppercase = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] 
lowercase = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] 

temp_unique_list = [] 

for i in list_string: 
    if i not in list_string: 
     temp_unique_list.append(i) 

sto avendo difficoltà a confronto ogni singole parole dal temp_unique_list se tale parola si ripete o meno. Per esempio: "a" e "A" (Io parto dal presupposto funzione gamma sarà utile)

E per rendere restituire la parola che viene prima nella lista originale che funziona prenderà in

Come direbbe. Lo faccio utilizzando il per il ciclo?

risposta

7

È possibile farlo con l'aiuto di una struttura for ciclo e dati set, come questo

def case_insensitive_unique_list(data): 
    seen, result = set(), [] 
    for item in data: 
     if item.lower() not in seen: 
      seen.add(item.lower()) 
      result.append(item) 
    return result 

uscita

['We', 'are', 'one', 'the', 'world', 'UNIVERSE'] 
1

Potete farlo come:

l = ["We", "are", "one", "we", "are", "the", "world", "we", "are", "THE", "UNIVERSE"] 

a = [] 

for i in l: 
    if i.lower() not in [j.lower() for j in a]: 
     a.append(i) 

>>> print a 
['We', 'are', 'one', 'the', 'world', 'UNIVERSE'] 
+2

Questo è un modo selvaggiamente inefficiente di fare questo compito. – roippi

1

È possibile utilizzare set() e una lista di comprensione:

>>> seen = set() 
>>> lst = ["We", "are", "one", "we", "are", "the", "world", "we", "are", "THE", "UNIVERSE"] 
>>> [x for x in lst if x.lower() not in seen and not seen.add(x.lower())] 
['We', 'are', 'one', 'the', 'world', 'UNIVERSE'] 
+0

"Come farei usando il ciclo for?" –

+2

-1 Avere effetti collaterali in un LC non è preferito. – thefourtheye

+0

@zmo Avere effetti collaterali in LC non è elegante. – thefourtheye

1
l=["We", "are", "one", "we", "are", "the", "world", "we", "are", "THE", "UNIVERSE"] 
so=[] 
for w in l: 
    if w.lower() not in so: 
     so.append(w.lower()) 

In [14]: so 
Out[14]: ['we', 'are', 'one', 'the', 'world', 'universe'] 
1

È possibile utilizzare un set per garantire l'unicità. Quando provi ad aggiungere un elemento ripetuto a un set, lo scarterà semplicemente se è già lì dentro.

Si dovrebbe anche usare la funzione in-built lower() per gestire l'insensibilità del case.

uniques = set() 
for word in words: 
    set.add(word.lower()) #lower it first and then add it 

Se questo è per un compito a casa e l'utilizzo di set è off limits, allora si può facilmente adattare ad utilizzare gli elenchi solo, basta scorrere e aggiungere la condizione:

uniques = list() 
if word.lower() not in uniques: 
    #etc 
0

ok, rimosso la mia risposta precedente, come ho letto male il post di OP. Tutte le mie scuse.

come una scusa, per il gusto di farlo e il gusto di farlo in modi diversi, ecco un'altra soluzione, anche se è né l'uno più efficiente, oppure il migliore:

>>> from functools import reduce 
>>> for it in reduce(lambda l,it: l if it in set({i.lower() for i in l}) else l+[it], lst, []): 
...  print(it, end=", ") 
+1

"Restituirà: [" We "," are "," one "," the "," world "," UNIVERSE " ] " –

+1

" Inoltre, non dice di voler mantenere il token in ordine: "" Ho bisogno di aiuto per restituire parole univoche (senza distinzione tra maiuscole e minuscole) da un elenco ** in ordine. ** " – roippi

+0

ok, frainteso: -) il mio male, anche se ho ottenuto un'altra soluzione, quindi sto modificando – zmo

1

È possibile utilizzare collections.OrderedDict come questo.

from collections import OrderedDict 
def case_insensitive_unique_list(data): 
    d = OrderedDict() 
    for word in data: 
     d.setdefault(word.lower(), word) 
    return d.values() 

uscita:

['We', 'are', 'one', 'the', 'world', 'UNIVERSE'] 
+0

Ahhh. Stavo per pubblicare la stessa risposta! –