我有:
>>> 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 行。我正在寻找能够更好地利用内置函数或itertoolsesque 库来实现更短代码和更快(C 本机)运行的东西。
编辑:
我应该更清楚地说明这一点。尽管为了简洁起见,我在上面的示例中使用了纯数字列表,但我实际使用的元素是元组,并且cmp仅测试元组的一部分是否相等。将元素视为记录和与关键字段cmp匹配的内容可能更容易。我可以将元素包装在一个类中并使其在键上可散列,但其他任何东西都不需要这样的设置,因此任何需要这样做的解决方案都会将其作为额外的代码和运行时开销。
将其总结为上述几点的补充:
cmp用于比较至关重要,因为它不是基本平等的测试。- 结果
[(a, b)],a应该是与 中的元素之一相同的实例和中的元素之一As的b相同实例Bs,前提是它们不是None。 As和Bs不可散列的元素。