Jeśli mam listę python, która ma wiele duplikatów i chcę iterować przez każdy element, ale nie przez duplikaty, najlepiej jest użyć zestawu (jak w set(mylist)
, lub znaleźć inny sposób, aby utworzyć listę bez duplikaty? Myślałam po prostu zapętlenie poprzez listy i sprawdzanie duplikatów, ale pomyślałem, że to, co set()
robi kiedy to zainicjowany.Lepiej/Szybciej przechodzić przez zestaw lub listę?
Więc jeśli mylist = [3,1,5,2,4,4,1,4,2,5,1,3]
i naprawdę chcą się pętli [1,2,3,4,5]
(kolejność nie ma znaczenia) należy użyć set(mylist)
lub coś innego?
Alternatywą jest możliwe w ostatnim przykładzie, ponieważ lista zawiera wszystkie liczby całkowite między jej min i m wartość osi, mogłem przechodzić przez range(min(mylist),max(mylist))
lub przez set(mylist)
. Czy ogólnie powinienem starać się unikać używania zestawu w tym przypadku? Ponadto, czy znalezienie min
i max
będzie wolniejsze niż samo tworzenie set
?
W przypadku w ostatnim przykładzie, set
jest szybsze:
from numpy.random import random_integers
ids = random_integers(1e3,size=1e6)
def set_loop(mylist):
idlist = []
for id in set(mylist):
idlist.append(id)
return idlist
def list_loop(mylist):
idlist = []
for id in range(min(mylist),max(mylist)):
idlist.append(id)
return idlist
%timeit set_loop(ids)
#1 loops, best of 3: 232 ms per loop
%timeit list_loop(ids)
#1 loops, best of 3: 408 ms per loop
Dlaczego nie przetestować go? –
@JoelCornett done :) – askewchan
Czy spodziewasz się, że ta różnica prędkości ma znaczenie w każdym programie, jaki kiedykolwiek napisałeś? Przechowywanie rzeczy w 'numpy', używając genexp zamiast budowania listy' milionowej 'elementu tylko po to, aby powtórzyć (i używając 'xrange' zamiast' range' jeśli to Py2), próbując zrobić ciasne pętle w C zamiast Pythona (np. 'idlist = range (...)' zamiast pętli 'for', która robi to samo), itd., wszystkie będą powodowały większą różnicę wielkości rzędów. – abarnert