Jak dodać zawartość iterable do zestawu?

Co to jest " jeden [...] oczywisty sposób " aby dodać wszystkie elementy iterable do istniejącego set?

Author: codeforester, 2010-10-28

6 answers

Możesz dodać elementy list do set w następujący sposób:

>>> foo = set(range(0, 4))
>>> foo
set([0, 1, 2, 3])
>>> foo.update(range(2, 6))
>>> foo
set([0, 1, 2, 3, 4, 5])
 244
Author: SingleNegationElimination,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-19 19:18:51

Z korzyścią dla każdego, kto wierzy np., że robienie aset.add() W pętli będzie miało wydajność konkurencyjną do robienia aset.update(), Oto przykład, jak możesz szybko sprawdzić swoje przekonania 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 na to, że koszt na element podejścia pętlowego jest ponad trzy razy większy niż podejście update.

Użycie |= set() kosztuje około 1,5 x to, co robi update, ale połowę tego, co robi dodanie każdego elementu w pętli.

 43
Author: John Machin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-30 19:36:48

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.

>>> a = { 1, 2, 3 }
>>> b = ( 3, 4, 5 )
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
 15
Author: gbc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 17:37:11

Tylko szybka aktualizacja, timingi 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 to:

one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082
 6
Author: Daniel Dubovski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-04 08:21:57

Użyj rozumienia listy.

Zwarcie tworzenia iterowalnego przy użyciu np. listy:)

>>> 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: przegapiłem setową część pytania]

 0
Author: pyfunc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 17:43:18
for item in items:
   extant_set.add(item)

Dla przypomnienia, myślę, że twierdzenie, że " powinien być jeden, a najlepiej tylko jeden, oczywisty sposób, aby to zrobić."jest fałszywy. To sprawia, że założenie, że wielu ludzi myślących technicznie, że wszyscy myślą podobnie. To, co jest oczywiste dla jednej osoby, nie jest tak oczywiste dla drugiej.

Twierdzę, że moje proponowane rozwiązanie jest czytelne i robi to, o co prosisz. Nie wierzę, że są z tym jakieś hity ... choć przyznaję, że coś mi umyka. Ale mimo wszystko, to może nie być oczywiste i korzystne dla innego dewelopera.
 -2
Author: jaydel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 18:25:15