[解決済み] リストの各項目と残りの項目を一度だけ比較するには?
質問
比較したいものの配列やリストがあるとします。私がより精通している言語では、私は次のようなことを行うでしょう。
for (int i = 0, i < mylist.size(); i++)
for (int j = i + 1, j < mylist.size(); j++)
compare(mylist[i], mylist[j])
これは、各ペアを一度だけ比較することを保証します。いくつかのコンテキストのために、私はリストに含まれるオブジェクトの束で衝突検出を行っています。検出された各衝突について、衝突を記述する小さな「衝突」オブジェクトがリストに追加され、別のルーチンがループして各衝突を解決します (衝突する 2 つのオブジェクトの性質に依存します)。明らかに、私は各衝突を一度だけ報告したいのです。
さて、Pythonはインデックスをループするよりもイテレータを使うことを好むので、これを行うためのPythonicな方法は何でしょうか?
私は以下のような(バグだらけの)コードを持っていました。
for this in mylist:
for that in mylist:
compare(this, that)
しかし、これは明らかに各衝突を2回ピックアップしており、それらを解決しようとすると奇妙な動作につながります。では、Pythonicな解決策は何でしょうか?
どのように解決するのでしょうか?
もちろん、これは各ペアを2回生成し、それぞれの
for
ループはリストのすべての項目を通過します。
を使うことができます。 itertools の魔法を使って、すべての可能な組み合わせを生成することができます。
import itertools
for a, b in itertools.combinations(mylist, 2):
compare(a, b)
itertools.combinations
は、各要素を反復可能な他の各要素と対にしますが、一度だけです。
インデックスベースのアイテムアクセスを使ってこれを書くことも可能で、あなたが慣れ親しんでいるものと同じように、ネストされた
for
ループを使用します。
for i in range(len(mylist)):
for j in range(i + 1, len(mylist)):
compare(mylist[i], mylist[j])
もちろん、この方法は見た目が悪く、パイソン的ではありませんが、時にはこれが最も簡単で理解しやすい解決方法であることもありますから、このような問題を解決することを敬遠すべきではありません。
関連
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] リストの要素数を取得する方法
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] リスト項目の出現回数を数えるにはどうしたらいいですか?
-
[解決済み] オブジェクトの属性に基づいてオブジェクトのリストを並べ替えるには?
-
[解決済み] リストから最初の項目を削除するには?
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] 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の構文に新しいステートメントを追加することはできますか?
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複