[解決済み] Pythonで|= (ior)は何をするのですか?
質問
Googleで検索できない
|=
ので、関連するドキュメントを探すのに苦労しています。どなたかご存知ですか?
解決方法は?
|=
が実行されます。
インプレース
+
オブジェクトのペアの間の操作を行う。 特に、間。
に関連する場合がほとんどです。
|
演算子を使用します。 以下の例を参照してください。
設定
例えば、2つの割り当てられた集合の和は
s1
と
s2
は、次のような等価表現を共有します。
>>> s1 = s1 | s2 # 1
>>> s1 |= s2 # 2
>>> s1.__ior__(s2) # 3
ここで、最終的な
s1
のどちらかで等価となる。
- 代入されたOR演算
- インプレースOR演算
- 特殊なメソッドによるインプレース OR 演算 ++
例
ここでは、ORを適用しています(
|
) と、インプレース OR (
|=
) から
セット
:
>>> s1 = {"a", "b", "c"}
>>> s2 = {"d", "e", "f"}
>>> # OR, |
>>> s1 | s2
{'a', 'b', 'c', 'd', 'e', 'f'}
>>> s1 # `s1` is unchanged
{'a', 'b', 'c'}
>>> # In-place OR, |=
>>> s1 |= s2
>>> s1 # `s1` is reassigned
{'a', 'b', 'c', 'd', 'e', 'f'}
ディクショナリー
で
Python 3.9+
は、新しいマージ (
|
) と更新 (
|=
という演算子が提案されている。注:これらは上記の集合演算子とは異なる。
割り当てられた2つのディクショナリー間の与えられた操作
d1
と
d2
:
>>> d1 = d1 | d2 # 1
>>> d1 |= d2 # 2
ここで
d1
は、viaと同等です。
- 割り当てられたマージライト操作
-
インプレース・マージ・ライト(更新)操作。
d1.update(d2)
例
ここでは、マージ(
|
) と更新 (
|=
) に変更します。
ディクショナリー
:
>>> d1 = {"a": 0, "b": 1, "c": 2}
>>> d2 = {"c": 20, "d": 30}
>>> # Merge, |
>>> d1 | d2
{"a": 0, "b": 1, "c": 20, "d": 30}
>>> d1
{"a": 0, "b": 1, "c": 2}
>>> # Update, |=
>>> d1 |= d2
>>> d1
{"a": 0, "b": 1, "c": 20, "d": 30}
カウンタ
は
collections.Counter
と呼ばれる数学的データ構造に関連しています。
多重集合
(mset)といいます。 基本的には、(オブジェクト、多重度)のキーと値のペアのディクショナリである。
割り当てられた2つのカウンタ間の与えられた操作
c1
と
c2
:
>>> c1 = c1 | c2 # 1
>>> c1 |= c2 # 2
ここで
c1
は、viaと同等です。
- 割り当てられたユニオン操作
- インプレース・ユニオン操作
A 多重集合の結合 には、各項目の最大倍率が含まれる。 これは、2つのセット間や2つの通常のディクショ ン間と同じようには動作しないことに注意してください。
例
ここでは、ユニオン(
|
) とインプレース・ユニオン (
|=
) から
カウンタ
:
import collections as ct
>>> c1 = ct.Counter({2: 2, 3: 3})
>>> c2 = ct.Counter({1: 1, 3: 5})
>>> # Union, |
>>> c1 | c2
Counter({2: 2, 3: 5, 1: 1})
>>> c1
Counter({2: 2, 3: 3})
>>> # In-place Union, |=
>>> c1 |= c2
>>> c1
Counter({2: 2, 3: 5, 1: 1})
数字
最後に、2進数の計算ができることです。
割り当てられた2つの数値の間の演算が与えられる
n1
と
n2
:
>>> n1 = n1 | n2 # 1
>>> n1 |= n2 # 2
ここで
n1
は、viaと同等です。
- 代入されたビット単位のOR演算
- インプレースのビット単位のOR演算
例
ここでは、ビット単位のORを適用しています(
|
) とインプレース・ビットワイズ OR (
|=
) を
数値
:
>>> n1 = 0
>>> n2 = 1
>>> # Bitwise OR, |
>>> n1 | n2
1
>>> n1
0
>>> # In-place Bitwise OR, |=
>>> n1 |= n2
>>> n1
1
レビュー
このセクションでは、ビット単位の計算について簡単に説明します。 最も単純なケースとして、ビット単位のOR演算は2つのバイナリビットを比較します。 これは常に
1
ただし、両方のビットが
0
.
>>> assert 1 == (1 | 1) == (1 | 0) == (0 | 1)
>>> assert 0 == (0 | 0)
この考え方を2進数の枠を超えて発展させたのが 分数成分を含まない)任意の2つの積分数が与えられたとき、ビット単位のORを適用して積分結果を得ます。
>>> a = 10
>>> b = 16
>>> a | b
26
どのように? 一般に、ビット演算はいくつかのルールに従っています。
- 内部的に2進数の等価物を比較する
- 演算を適用する
- 指定された型として結果を返す
これらのルールを上記の通常の整数に適用してみましょう。
(1) 2進数の等価物を比較する。ここでは文字列として見ている (
0b
はバイナリを表す)。
>>> bin(a)
'0b1010'
>>> bin(b)
'0b10000'
(2) 各カラムにビット単位の OR 演算を適用する (
0
が両方ある場合
0
でなければ
1
):
01010
10000
-----
11010
(3) 結果を指定された型、例えば10進数で返す。
>>> int(0b11010)
26
内部の二項比較は、16進数や8進数など、どの基数の整数にも後者を適用できることを意味する。
>>> a = 10 # 10, dec
>>> b = 0b10000 # 16, bin
>>> c = 0xa # 10, hex
>>> d = 0o20 # 16, oct
>>> a | b
26
>>> c | d
26
こちらもご覧ください
-
の例
をオーバーロードして
__ior__()
メソッド でイテレートすることができます。MutableSet
抽象基底クラス - R. Hettingerの OrderedSetのレシピ(それぞれ3行目、10行目参照)
-
A
Python-ideasのスレッド
を使用する理由
|=
セットを更新するために - A Dive in Python 3 の B.8 節を参照してください。 Pythonの演算子の特殊なメソッドについて
- インプレース二項演算子は通常のメソッドにフォールバックします。 eval.c と abstract.c ). ありがとう、@asotille。
+ <サブ インプレース・ビットワイズ OR 演算子はリテラルには適用できませんので、オブジェクトを名前に割り当ててください。
++ <サブ 特殊なメソッドは、対応する演算子と同じ操作を返します。
関連
-
python implement mysql add delete check change サンプルコード
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonの "at"(@)マークは何をするものですか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない