Что такое "один [...] очевидный способ" , чтобы добавить все элементы итерабельности в существующий set
?
Python: как добавить содержимое итерабельного в набор?
Ответ 1
Вы можете добавить элементы list
в 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])
Ответ 2
В интересах любого, кто мог бы верить, например. что выполнение aset.add()
в цикле было бы конкурентоспособным по производительности при выполнении aset.update()
, вот пример того, как вы можете быстро проверить свои убеждения, прежде чем публиковать:
>\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
Похоже, что стоимость элемента элемента цикла за три раза больше, чем у подхода update
.
Использование |= set()
стоит около 1.5x, что делает update
, но половина того, что делает каждый отдельный элемент в цикле.
Ответ 3
Вы можете использовать функцию set() для преобразования итерации в набор, а затем использовать стандартный оператор обновления набора (| =), чтобы добавить уникальные значения из вашего нового набора в существующий.
>>> a = { 1, 2, 3 }
>>> b = ( 3, 4, 5 )
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
Ответ 4
Просто быстрое обновление, тайминги с использованием python 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)
:
one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082
Ответ 5
Использовать список.
Короткое замыкание создания итерации с использованием списка, например:)
>>> 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])
>>>
[Изменить: пропустил заданную часть вопроса]
Ответ 6
У наборов также есть метод добавления:
>>> 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])
Ответ 7
for item in items:
extant_set.add(item)
Для записи я считаю утверждение, что "Должен быть один - и желательно только один - простой способ сделать это". является фиктивным. Это делает предположение, что многие технические люди делают, что все думают одинаково. То, что очевидно для одного человека, не так очевидно для другого.
Я бы сказал, что мое предлагаемое решение ясно читается и делает то, что вы просите. Я не верю, что в нем есть какие-то хиты производительности, хотя я признаю, что мог что-то упустить. Но, несмотря на все это, это может быть не очевидно и предпочтительнее для другого разработчика.
Ответ 8
Мне нравится этот путь:
set = [item for item in items]