Jaki jest „jeden [...] oczywisty sposób”, aby dodać wszystkie elementy iterowalne do istniejącego set
?
python
set
conventions
iterable
Ian Mackinnon
źródło
źródło
set
konstruktor przyjmuje iterowalny argument jako argument.{1, 2, 3}
W Pythonie 3, podczas gdy byłaset([1, 2, 3])
w Pythonie 2.Z korzyścią dla każdego, kto mógłby wierzyć np., Że robienie
aset.add()
w pętli mogłoby konkurować z działaniemaset.update()
, oto przykład, w jaki sposób można szybko sprawdzić swoje przekonania przed ujawnieniem się:Wygląda na to, że koszt jednej pozycji w podejściu pętlowym jest TRZY razy większy niż w przypadku
update
podejścia.Korzystanie
|= set()
kosztuje okołoupdate
1,5 raza więcej , ale połowę tego, co daje dodanie każdego pojedynczego elementu w pętli.źródło
Możesz użyć funkcji set (), aby przekonwertować iterowalny zestaw na zestaw, a następnie użyć standardowego operatora aktualizacji zestawu (| =), aby dodać unikalne wartości z nowego zestawu do istniejącego.
źródło
.update
ma tę zaletę, że argument może być dowolnie iterowalny - niekoniecznie jako zbiór - w przeciwieństwie do prawej strony|=
operatora w twoim przykładzie.|
dla unii,&
dla przecięcia i^
dla pobrania elementów, które są w jednym lub drugim, ale nie w obu. Ale w dynamicznie wpisywanym języku, w którym czasami trudno jest odczytać kod i poznać typy obiektów latających dookoła, waham się, czy używać tych operatorów. Ktoś, kto ich nie rozpoznaje (a może nawet nie zdaje sobie sprawy, że Python dopuszcza takie operatory) może być zdezorientowany i pomyśleć, że mają miejsce jakieś dziwne operacje bitowe lub logiczne. Byłoby miło, gdyby ci operatorzy pracowali również nad innymi.update()
i dodałem poszczególne elementy w pętli. Okazało się, że.update()
było szybsze. Dodałem moje wyniki do tej istniejącej odpowiedzi: stackoverflow.com/a/4046249/901641Tylko szybka aktualizacja, czasy w Pythonie 3:
wyniki to:
źródło
Używaj rozumienia list.
Krótkie zwarcie tworzenia iterowalnego za pomocą listy, na przykład :)
[Edytuj: brakowało części pytania]
źródło
Dla porządku, myślę, że stwierdzenie, że „Powinien istnieć jeden - a najlepiej tylko jeden - oczywisty sposób na zrobienie tego”. jest fałszywy. Zakłada, że wielu ludzi zorientowanych technicznie uważa, że wszyscy myślą podobnie. To, co jest oczywiste dla jednej osoby, nie jest takie oczywiste dla drugiej.
Twierdzę, że proponowane przeze mnie rozwiązanie jest czytelne i robi to, o co prosisz. Nie wierzę, że są z tym związane jakieś przeboje - chociaż przyznaję, że czegoś mi brakuje. Ale mimo wszystko może to nie być oczywiste i preferowane dla innego programisty.
źródło
aset.update(iterable)
zapętla się z prędkością C, podczas gdyfor item in iterable: aset.add(item)
pętle z szybkością Pythona, z wyszukiwaniem metod i wywołaniem metody (aarrgghh !!) na element.