2014-05-05 18 views
5

Potrzebuję pomocy w zwrocie unikalnych słów (bez uwzględnienia wielkości liter) z listy w kolejności.Python zwracający unikalne słowa z listy (bez uwzględnienia wielkości liter)

Na przykład:

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

Wrócimy: [ "my", "to", "jeden", "the", "świat", "UNIVERSE"]

Jak dotąd jest to, co mam:

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) 

mam problemy porównujący co poszczególne słowa z temp_unique_list czy to słowo powtarza się lub nie. Na przykład: „do” i „Do” (jestem zakładając Funkcja Zakres będzie przydatna)

I aby powrócić na słowo, które przychodzi pierwszy z oryginalnej listy, która funkcja będzie podjąć w

Jak zrobi. Robię to za pomocą dla pętli?

Odpowiedz

7

Można to zrobić za pomocą struktury for pętli i set danych, jak ten

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 

Output

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

Można to zrobić jako:

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

Jest to szalenie nieefektywny sposób wykonywania tego zadania. – roippi

1

Możesz użyć set() oraz listę zrozumieniem:

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

"Jak to zrobić, używając pętli for?" –

+2

-1 Skutki uboczne w LC nie są preferowane. – thefourtheye

+0

@zmo Skutki uboczne w LC nie są eleganckie. – 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

Można użyć zestawu, aby zapewnić niepowtarzalność. Gdy spróbujesz dodać powtarzany element do zestawu, po prostu go odrzucisz, jeśli już tam jest.

Powinieneś także używać wbudowanej funkcji dolnej() do zarządzania wielkością liter.

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

Jeśli jest to dla zadania domowe i stosując zestaw jest wyłączony limitów, można łatwo dostosować go tylko do korzystania z list, tylko pętlę przez i dodać warunek:

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

ok, usunięte moja poprzednia odpowiedź, ponieważ błędnie przeczytałem post OP. Wszystkie moje przeprosiny.

jako pretekst, dla zabawy i ze względu na to robić na różne sposoby, oto kolejne rozwiązanie, choć nie jest to ani najskuteczniejszy jeden lub najlepiej:

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

"Wróci: [" My "," jesteśmy "," jeden "," ten "," świat "," WSZECHŚWIAT " ] " –

+1

" A także, ponieważ nie mówi, że chce zachować token w porządku: '" Potrzebuję pomocy w zwrocie unikalnych słów (bez względu na wielkość liter) z listy ** w porządku. ** " – roippi

+0

ok, błędne odczytanie: -) moje złe, chociaż mam inne rozwiązanie, więc edytuję – zmo

1

Można użyć collections.OrderedDict lubię to.

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

wyjściowa:

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

Ahhh. Zamierzałem opublikować tę samą odpowiedź! –

Powiązane problemy