如何压缩两个序列(一个由N个元素移位)



我有两个列表AB,我想遍历元素对(A[0], B[2])(A[1], B[3])等。如果没有转换,我可以使用zip(A, B)来有效地完成它。

在这个例子中,移位是2,但可能会发生,我需要N的移位。如何有效地做到这一点(不索引到两个列表中(?

我认为一个简洁的方法是

zipped = zip(list1, list2[n:])

其中n是表示偏移量的整数。

最终,我得到了以下通用函数:

def zip_shift(s1, s2, shift, placeholder):
i1 = iter(s1)
i2 = iter(s2)
while shift > 0:
yield placeholder, next(i2)  # leave only next(i2) if no placeholder pairs are needed
shift -= 1
yield from zip(i1, i2)  # or return zip

上述函数的工作方式类似于首先填充placeholdershift次而不是从第二序列s2中获取值的生成器。之后,它就像zip一样工作。yield from是一个相对较新的构造(自Python 3.3以来(。上面的yield fromreturn之间有细微的区别,但在这种情况下可以忽略。

当然,如果shift的值几乎为1(带有占位符的对除外(,则可以使用实现相同的结果

zip(s1, next(s2))

与CCD_ 15序列一样,序列不必具有相同的长度。只要较短的序列没有耗尽,生成器就会工作。

相关内容

最新更新