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