[解決済み] Pythonのセット操作における追加と更新の比較
2023-05-17 16:15:17
質問
Pythonでaddとupdateの操作の違いは何ですか?
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]
はセットに追加される要素として扱われ、エラーメッセージにあるように
a list cannot be hashed
というエラーメッセージが出ますが、セットの要素はすべてハッシュ化可能であることが期待されます。を引用すると
のドキュメントを引用します。
,
新しい
set
またはfrozenset
オブジェクトで、その要素は iterable から取得されます。集合の要素は必ず ハッシュ化可能 .
の場合
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])
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] オブジェクト名の前のシングルアンダーコアとダブルアンダーコアの意味は何ですか?
-
[解決済み] 誰かPythonで__all__を説明してくれませんか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンプティセットリテラル?
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonの検索パスを他のソースに展開する