Co to jest "one [...] obvious way", aby dodać wszystkie elementy wersji do istniejącego set
?Python: jak dodać zawartość pliku iteracyjnego do zestawu?
Odpowiedz
przez zestaw, masz na myśli set
?
>>> foo = set(range(0, 4))
>>> foo
set([0, 1, 2, 3])
>>> foo.update(range(2, 6))
>>> foo
set([0, 1, 2, 3, 4, 5])
Kocham ten sposób:
set = [item for item in items]
@dolma, nie chcę, aby utworzyć * * nowy zestaw, ale dodać do zachowany zestaw. Przepraszam, jeśli to było niejasne; Zmieniłem to pytanie, by wyjaśnić. –
@dolma, również, (a) możesz zrobić 's = set (items)' oraz (b) twój przykład na nowo definiuje wbudowany :) –
to po prostu możesz zrobić 'set.extend ([element dla pozycji w pozycjach ]) ', Myślę ... – dolma33
Zastosowanie lista zrozumieniem.
Krótkie spięcie tworzenie iterable używając listę na przykład :)
>>> x = [1, 2, 3, 4]
>>>
>>> k = x.__iter__()
>>> k
<listiterator object at 0x100517490>
>>> l = [y for y in k]
>>> l
[1, 2, 3, 4]
>>>
>>> z = Set([1,2])
>>> z.update(l)
>>> z
set([1, 2, 3, 4])
>>>
[EDIT: brakowało nastawioną część Pytanie]
Nie widzę żadnych zestawów? Czy czegoś brakuje? –
@Ian Mackinnon: Aah! Zupełnie tęskniłem za tym punktem. Dzięki. – pyfunc
for item in items:
extant_set.add(item)
Dla przypomnienia, myślę, że twierdzenie, że „nie powinno być jedno- i korzystnie tylko jeden --obvious sposób to zrobić.” jest fałszywe. Przyjmuje założenie, że wielu myślących technicznie ludzi sprawia, że wszyscy myślą tak samo. To, co dla jednej osoby jest oczywiste, nie jest tak oczywiste dla drugiego.
Chciałbym argumentować, że proponowane przeze mnie rozwiązanie jest czytelne i spełnia to, o co prosisz. Nie wierzę, że są w to zaangażowane jakieś hity wydajności - choć przyznaję, że czegoś mi brakowało. Ale mimo wszystko, może nie być oczywiste i lepsze od innego programisty.
Zestawy posiadają metodę dodawać zbyt:
>>> s=set([1,2,3,4])
>>> for n in range(10):
s.add(n)
>>> s
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
można użyć funkcji set() do konwersji iterable w zestawie, a następnie użyć standardowego operatora zestaw aktualizacji (| =), aby dodać unikatowe wartości od nowego zestawu do istniejącego.
>>> a = { 1, 2, 3 }
>>> b = (3, 4, 5)
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
Użycie '.update' ma tę zaletę, że argumentem może być dowolna iteracja - niekoniecznie jest to zestaw podobny do RHS operatora' | = 'w twoim przykładzie. – tzot
Dobra uwaga. To po prostu estetyczny wybór, ponieważ set() może przekonwertować plik iterowalny na zestaw, ale liczba naciśnięć klawiszy jest taka sama. – gbc
Nigdy wcześniej nie widziałem tego operatora, z przyjemnością go użyję, gdy pojawi się w przyszłości; dzięki! – eipxen
Dla korzyści każdego, kto może wierzyć np. że robi aset.add()
w pętli miałby wydajność konkurencyjnej robi aset.update()
, oto przykład jak można przetestować swoje przekonania szybko przed upublicznieniem:
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 294 usec per loop
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 950 usec per loop
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 458 usec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 598 usec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 1.89 msec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 891 usec per loop
Wygląda kosztów za przesyłkę podejścia pętli jest ponad trzykrotnie z podejścia update
.
Używanie |= set()
kosztuje około 1,5x to, co robi update
, ale połowę tego, co dodaje każdy pojedynczy element w pętli.
Tylko szybka zmiana, czasy przy użyciu Pythona 3:
#!/usr/local/bin python3
from timeit import Timer
a = set(range(1, 100000))
b = list(range(50000, 150000))
def one_by_one(s, l):
for i in l:
s.add(i)
def cast_to_list_and_back(s, l):
s = set(list(s) + l)
def update_set(s,l):
s.update(l)
Wyniki są następujące:
one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082
- 1. iteracyjnego krotki
- 2. jak dodać linie do istniejącego pliku za pomocą python
- 3. Jak dodać kod PHP do pliku .tpl
- 4. Jak dodać dane z gnuplot do istniejącego pliku bez overwiting zawartość wspomnianego pliku
- 5. jak skopiować zawartość pliku jtable do schowka
- 6. Jak odczytać zawartość pliku do zmiennej SQL
- 7. jak zapisać wygenerowaną zawartość DOMPDF do pliku?
- 8. Jak wydrukować zawartość pliku .txt w języku Python?
- 9. dodać vs aktualizacji w operacji zestawu w python
- 10. Jak załadować zawartość innego pliku do bieżącego pliku w Vim?
- 11. Jak wyczyścić zawartość pliku jTable?
- 12. Jak rozpakować zawartość pliku JavaScript?
- 13. iteracyjnego obiektu w coffeescript
- 14. iteracyjnego iloczyn kartezjański wektorów
- 15. Jak dodać moduł do autouzupełniania w Python?
- 16. Jak odczytać zawartość pliku z pliku?
- 17. Modyfikuj zawartość okna dialogowego pobierania przeglądarki Firefox z zestawu dodatków
- 18. Jak mogę dodać dodatkową zawartość do elementu TabControl WPF?
- 19. Jak dodać odpowiednie kolumny do zestawu danych PIVOT
- 20. Jak poprawnie dodać nowe rekordy do pustego zestawu rekordów ręcznie?
- 21. Jak mogę dodać elementy do pustego zestawu w Pythonie
- 22. Python: Uzyskaj dostęp do elementów zestawu
- 23. Importowanie zestawu danych SPSS do Python
- 24. jak zdobyć (txt) zawartość pliku z FileField?
- 25. Jak lepiej iteracyjnego państwa w Clojure (monady?)
- 26. Osadź zawartość pliku RTF w pliku DOCX przy użyciu zestawu OpenXML SDK
- 27. Jak dodać folder do pliku NIPEC
- 28. Jak dodać przycisk do pliku settings.bundle?
- 29. Jak dodać użytkownika do pliku dockerfile?
- 30. Jak dodać atrybuty danych do pliku Html.BeginForm
Tak, nie spodziewałem się, że będzie dwuznaczny, ale wygląda na to, że jest :) Aktualizacja jest rzeczą bardzo ważną. Dziękuję Ci! –
Spojrzałem tylko na moją sesję tłumacza i faktycznie wypróbowałem to, ale pomyślałem, że dodało ono całą listę jako element zestawu z powodu nawiasów kwadratowych w reprezentacji zestawu. Nigdy wcześniej nie zauważyłem, że są reprezentowani w ten sposób. –
Ta reprezentacja umożliwia wklejenie jej z powrotem w sesji interaktywnej, ponieważ konstruktor 'set' przyjmuje jako argument iterację. –