Подтвердить что ты не робот

Добавить vs update в заданные операции в python

В чем разница между операциями добавления и обновления в python, если я просто хочу добавить одно значение в набор.

a = set()
a.update([1]) #works
a.add(1) #works
a.update([1,2])#works
a.add([1,2])#fails 

Может кто-нибудь объяснить, почему это так.

4b9b3361

Ответ 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, вот ссылка.