web-dev-qa-db-ja.com

pythonの集合演算での追加と更新

セットに単一の値を追加する場合、pythonの追加操作と更新操作の違いは何ですか。

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

誰かがこれがなぜそうなのか説明できますか。

64
aceminer

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]はセットに追加される要素として扱われ、エラーメッセージに示されているように、 リストをハッシュできません ですが、セットのすべての要素はハッシュ可能と見なされます。 ドキュメント を引用

要素が反復可能から取得された新しい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])
82
thefourtheye

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は反復可能または反復可能を想定しているため、追加するハッシュ可能要素が1つの場合はaddを使用し、追加するハッシュ可能要素の反復可能または反復可能がある場合はupdateを使用します。

s.add(x)要素xを追加してsを設定します

s.update(t)s | = tは、tから要素が追加されたセットsを返します

15

addは要素を追加し、updateは別の反復可能なsetlistまたは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])
11
Akavall

.add()は単一のelementを対象としていますが、.update()は他のセットの導入を対象としています。

help()から:

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
monkut

addは、ハッシュ可能なタイプのみを受け入れます。リストはハッシュ可能ではありません。

3
Frank

コード内のa.update(1)は機能しません。 addは要素を受け入れ、まだ存在しない場合はセットに入れますが、updateは反復可能を取り、その反復可能とセットの和集合を作成します。リストのappendextendのようなものです。

2
ekipmanager

Hackerrankの優れたリソースについて誰も言及していないと思います。 HackerrankがPythonのset for updateとaddの違いについて言及している方法を貼り付けたいと思います。

セットは、一意の値の順序付けられていないバッグです。単一のセットには、不変のデータ型の値が含まれます。

作成セット

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-add()およびupdate()

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の詳細については、 リンクはこちら

1
harrisonthu

addメソッドは要素をセットに直接追加しますが、updateメソッドは最初の引数をセットに変換し、リストをハッシュ可能に追加するため、ハッシュ可能なリストにハッシュ可能なリストを追加できません。

0
PRATIK M VYAS