我有:
>>> 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)]
换句话说,给定两个任意序列As
和Bs
,我想生成一个元组列表,Rs
使得满足的选择cmp(a, b) == 0
一起配对成它们自己的 tuple (a, b)
,但是那些匹配As
和Bs
不匹配的选项分别输出为(a, None)
和(None, b)
。
几点:
- 我不担心重复
As
或Bs
不会有任何重复。 Rs
可以是产生相同序列的迭代器。- 的顺序
Rs
并不重要。
我已经使用直接的预排序循环实现了满足功能要求的东西,但它大约有 30 行。我正在寻找能够更好地利用内置函数或itertools
esque 库来实现更短代码和更快(C 本机)运行的东西。
编辑:
我应该更清楚地说明这一点。尽管为了简洁起见,我在上面的示例中使用了纯数字列表,但我实际使用的元素是元组,并且cmp
仅测试元组的一部分是否相等。将元素视为记录和与关键字段cmp
匹配的内容可能更容易。我可以将元素包装在一个类中并使其在键上可散列,但其他任何东西都不需要这样的设置,因此任何需要这样做的解决方案都会将其作为额外的代码和运行时开销。
将其总结为上述几点的补充:
cmp
用于比较至关重要,因为它不是基本平等的测试。- 结果
[(a, b)]
,a
应该是与 中的元素之一相同的实例和中的元素之一As
的b
相同实例Bs
,前提是它们不是None
。 As
和Bs
不可散列的元素。