[解決済み】Pythonで2つのリストを引き算する
質問
Pythonで、2つの一意でない順序付きリストを引き算するにはどうしたらよいでしょうか?私たちが持っているとしましょう
a = [0,1,2,1,0]
と
b = [0, 1, 1]
のようなことをしたい。
c = a - b
を持ち
c
である
[2, 0]
または
[0, 2]
の順番はどうでもいいんです。これは、aがbのすべての要素を含んでいない場合、例外を投げる必要があります。
これはセットとは異なることに注意してください aとbの要素の集合の差を求めるのではなく、aとbの要素の実際の集まりの差に興味があるのです。
forループで、aの中のbの最初の要素を調べて、bとaから要素を取り除く、などということができますね。しかし、これは私には魅力的ではありません、非常に非効率的でしょう(順序が
O(n^2)
で行うのは問題ないはずなのに、時間がかかる。
O(n log n)
時間です。
解決方法は?
Python 2.7と3.2には
collections.Counter
クラスは、要素をその要素の出現回数に対応させる辞書のサブクラスです。 これは多重集合として使うことができる。次のようなことができます。
from collections import Counter
a = Counter([0, 1, 2, 1, 0])
b = Counter([0, 1, 1])
c = a - b # ignores items in b missing in a
print(list(c.elements())) # -> [0, 2]
の各要素が正しく動作していることを確認したい場合にも、同様に
b
は
a
:
# a[key] returns 0 if key not in a, instead of raising an exception
assert all(a[key] >= b[key] for key in b)
しかし、あなたは2.5から抜け出せないので、それをインポートして、それが失敗した場合に独自のバージョンを定義することを試みてはどうでしょうか。 そうすれば、最新版があれば確実に入手できるし、そうでなければ動作するバージョンにフォールバックすることができる。また、将来的にC言語の実装に変換された場合、速度向上の恩恵を受けることができます。
try:
from collections import Counter
except ImportError:
class Counter(dict):
...
現在のPythonのソースを見ることができます ここで .
関連
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] 2つのリストを辞書に変換するにはどうしたらいいですか?
-
[解決済み] リストの順番を維持したまま、重複を削除するにはどうしたらいいですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
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 implement mysql add delete check change サンプルコード
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?