Mój projekt wymagał tego wystarczająco dużo czasu, że mam nadzieję, że ktoś tutaj może dać mi elegancki sposób napisania.

Mam listę strun i chciałbyś odfiltrować duplikaty za pomocą funkcjonalności klucza / klucza (jak mogę zrobić z sorted([foo, key=bar)).

Ostatnio mam do czynienia z linkami.

Obecnie muszę utworzyć pustą listę i dodać wartości, jeśli

Uwaga: name to nazwa pliku Ogólny link również - tylko dopasowanie regex

parsed_links = ["http://www.host.com/3y979gusval3/name_of_file_1",          
                "http://www.host.com/6oo8wha55crb/name_of_file_2", 
                "http://www.host.com/6gaundjr4cab/name_of_file_3",                
                "http://www.host.com/udzfiap79ld/name_of_file_6", 
                "http://www.host.com/2bibqho4mtox/name_of_file_5", 
                "http://www.host.com/4a31wozeljsp/name_of_file_4"]

links = []
[links.append(link) for link in parsed_links if not name(link) in 
             [name(lnk) for lnk in links]]

Chcę, aby ostatnia lista miała pełne linki (więc nie mogę po prostu pozbyć się wszystkiego, ale nazwy plików i zestawu użytkowania); Ale chciałbym być w stanie to zrobić bez tworzenia pustej listy za każdym razem.

Ponadto moja obecna metoda wydaje się nieefektywna (która jest istotna, ponieważ często zajmuje się setkami linków).

Jakieś sugestie?

2
Robin Hood 1 sierpień 2012, 16:04

2 odpowiedzi

Najlepsza odpowiedź

Dlaczego nie skorzystać po prostu ze słownika?

links = dict((name(link), link) for link in parsed_links)
3
sloth 1 sierpień 2012, 12:10

Jeśli poprawnie rozumiem twoje pytanie, problemy z wydajnością mogą pochodzić z wymiaru wykazu, które jest wielokrotnie oceniane w ciasnej pętli.

Spróbuj buforować wynik, umieszczając rozumienie listy poza pętlą, a następnie użyj innego zrozumienia zamiast append() na pustej liście:

linkNames = [name(lnk) for lnk in links]
links = [link in parsed_links if not name(link) in linkNames]
0
Frédéric Hamidi 1 sierpień 2012, 12:08