私は持っています:
>>> As = [1, 2, 5, 6]
>>> Bs = [2, 3, 4, 5]
私は以下のようなものが欲しいですzip_fn:
>>> Rs = zip_fn(As, Bs, cmp)
>>> Rs
[(1, None), (2, 2), (None, 3), (None, 4), (5, 5), (6, None)]
つまり、2つの任意のシーケンスAsとが与えられた場合、満たす選択肢がペアになって独自のタプルになるようBsにタプルのリストを作成したいのですが、対応するものがある場合とない場合はそれぞれととして出力されます。Rscmp(a, b) == 0(a, b)AsBs(a, None)(None, b)
いくつかのポイント:
As重複がないので、重複については心配していBsません。Rs同じシーケンスを生成するイテレータにすることができます。- の順序
Rsは重要ではありません。
単純な事前ソートループを使用して機能要件を満たすものをすでに実装しましたが、約30行です。itertoolsビルトインまたはesqueライブラリをより有効に活用して、コードを短くし、(Cネイティブ)実行を高速化するものを探しています。
編集:
私はこれをもっと明確にすべきだった。上記の例では簡潔にするために単純な数値のリストを使用しましたが、実際に使用している要素はタプルでありcmp、タプルの一部のみが等しいかどうかをテストします。要素をレコードであり、キーフィールドcmpに一致するものと考える方が簡単な場合があります。要素をクラスにラップしてキーでハッシュ可能にすることもできますが、そのような設定は他には必要ないため、これを必要とするソリューションでは、追加のコードと実行時のオーバーヘッドとしてこれを取得します。
上記のいくつかへの追加のポイントとしてこれを要約します:
cmpこれは基本的な平等のテストではないため、比較に使用することが重要です。- 結果
[(a, b)]では、は、の要素の1つと同じインスタンスであり、の要素の1つの同じインスタンスでaある必要があります(そうでない場合)。AsbBsNone - 内の要素
Asとハッシュ可能でBsはありません。