セットに単一の値を追加する場合、pythonの追加操作と更新操作の違いは何ですか。
a = set()
a.update([1]) #works
a.add(1) #works
a.update([1,2])#works
a.add([1,2])#fails
誰かがこれがなぜそうなのか説明できますか。
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
の場合、複数の反復可能要素を渡すことができ、すべての反復可能要素を反復処理して、セット内の個々の要素を含めます。 覚えておいてください:イテラブルのみを受け入れることができます。 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])
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を返します
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])
.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.
add
は、ハッシュ可能なタイプのみを受け入れます。リストはハッシュ可能ではありません。
コード内のa.update(1)
は機能しません。 add
は要素を受け入れ、まだ存在しない場合はセットに入れますが、update
は反復可能を取り、その反復可能とセットの和集合を作成します。リストのappend
やextend
のようなものです。
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の詳細については、 リンクはこちら
addメソッドは要素をセットに直接追加しますが、updateメソッドは最初の引数をセットに変換し、リストをハッシュ可能に追加するため、ハッシュ可能なリストにハッシュ可能なリストを追加できません。