Добавить vs update в заданные операции в python
В чем разница между операциями добавления и обновления в python, если я просто хочу добавить одно значение в набор.
a = set()
a.update([1]) #works
a.add(1) #works
a.update([1,2])#works
a.add([1,2])#fails
Может кто-нибудь объяснить, почему это так.
Ответы
Ответ 1
set.add
set.add
добавляет отдельный элемент в набор. Таким образом,
>>> a = set()
>>> a.add(1)
>>> a
set([1])
работает, но он не может работать с итерируемым, если только он не хешируется. Вот почему a.add([1, 2])
терпит неудачу.
>>> a.add([1, 2])
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'
Здесь [1, 2]
рассматривается как элемент, добавляемый в набор, и, как говорится в сообщении об ошибке, список не может быть хэширован, но все элементы Ожидается, что набор будет hashables. Цитируя документацию,
Возвращает новый объект set
или frozenset
, элементы которого берутся из итерабельного. Элементы набора должны быть hashable.
set.update
В случае set.update
вы можете передать ему несколько итераций, и он будет перебирать все итерации и будет включать отдельные элементы в задавать. Помните: он может принимать только итерации. Вот почему вы получаете сообщение об ошибке при попытке обновить его с помощью 1
>>> a.update(1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'int' object is not iterable
Но следующее будет работать, потому что список [1]
повторяется и элементы списка добавляются в набор.
>>> a.update([1])
>>> a
set([1])
set.update
является в основном эквивалентом операции объединения на месте. Рассмотрим следующие случаи:
>>> set([1, 2]) | set([3, 4]) | set([1, 3])
set([1, 2, 3, 4])
>>> set([1, 2]) | set(range(3, 5)) | set(i for i in range(1, 5) if i % 2 == 1)
set([1, 2, 3, 4])
Здесь мы явно преобразуем все итерации в множества, а затем найдем объединение. Существует несколько промежуточных наборов и объединений. В этом случае set.update
служит хорошей вспомогательной функцией. Поскольку он принимает любой итеративный вариант, вы можете просто сделать
>>> a.update([1, 2], range(3, 5), (i for i in range(1, 5) if i % 2 == 1))
>>> a
set([1, 2, 3, 4])
Ответ 2
add
работает быстрее для одного элемента, потому что это именно для этой цели, добавив один элемент:
In [5]: timeit a.update([1])
10000000 loops, best of 3: 191 ns per loop
In [6]: timeit a.add(1)
10000000 loops, best of 3: 69.9 ns per loop
update
ожидает итерации или итераций, поэтому, если у вас есть один хешируемый элемент для добавления, используйте add
, если у вас есть итерируемые или итеративные элементы хешируемых элементов, чтобы добавить использование update
.
s.add(x) добавить элемент x, чтобы установить s
s.update(t) s | = t возвращает набор s с элементами, добавленными из t
Ответ 3
add
добавляет элемент, update
"добавляет" еще один итеративный set
, list
или tuple
, например:
In [2]: my_set = {1,2,3}
In [3]: my_set.add(5)
In [4]: my_set
Out[4]: set([1, 2, 3, 5])
In [5]: my_set.update({6,7})
In [6]: my_set
Out[6]: set([1, 2, 3, 5, 6, 7])
Ответ 4
.add()
предназначен для одиночного element
, тогда как .update()
предназначен для введения других наборов.
Из справки():
add(...)
Add an element to a set.
This has no effect if the element is already present.
update(...)
Update a set with the union of itself and others.
Ответ 5
add
принимает только хешируемый тип. Список не хешируется.
Ответ 6
a.update(1)
в вашем коде не будет работать. add
принимает элемент и помещает его в набор, если он еще не существует, но update
принимает итерабельность и делает объединения множества с этим итерабельным. Это похоже на append
и extend
для списков.
Ответ 7
Я думаю, никто не упомянул о хорошем ресурсе от Hackerrank. Я хотел бы вставить, как Hackerrank упоминает разницу между обновлением и добавлением для набора в python.
Установки представляют собой неупорядоченный мешок с уникальными значениями. Один набор содержит значения любого неизменяемого типа данных.
СОЗДАНИЕ УСТАНОВКИ
myset = {1, 2} # Directly assigning values to a set
myset = set() # Initializing a set
myset = set(['a', 'b']) # Creating a set from a list
print(myset) ===> {'a', 'b'}
MODIFYING SET - добавить() и обновить()
myset.add('c')
myset ===>{'a', 'c', 'b'}
myset.add('a') # As 'a' already exists in the set, nothing happens
myset.add((5, 4))
print(myset) ===> {'a', 'c', 'b', (5, 4)}
myset.update([1, 2, 3, 4]) # update() only works for iterable objects
print(myset) ===> {'a', 1, 'c', 'b', 4, 2, (5, 4), 3}
myset.update({1, 7, 8})
print(myset) ===>{'a', 1, 'c', 'b', 4, 7, 8, 2, (5, 4), 3}
myset.update({1, 6}, [5, 13])
print(myset) ===> {'a', 1, 'c', 'b', 4, 5, 6, 7, 8, 2, (5, 4), 13, 3}
Надеюсь, это поможет. Для более подробной информации о Hackerrank, вот ссылка.