【发布时间】:2020-06-13 08:28:43
【问题描述】:
我有两个列表A 和B,我想遍历元素对(A[0], B[2])、(A[1], B[3]) 等。
如果没有班次,我可以使用zip(A, B) 来有效地做到这一点。
在这个例子中,移位是 2,但可能发生我需要移位 N。如何有效地做到这一点(不索引到两个列表中)?
【问题讨论】:
标签: python python-3.x iterator
我有两个列表A 和B,我想遍历元素对(A[0], B[2])、(A[1], B[3]) 等。
如果没有班次,我可以使用zip(A, B) 来有效地做到这一点。
在这个例子中,移位是 2,但可能发生我需要移位 N。如何有效地做到这一点(不索引到两个列表中)?
【问题讨论】:
标签: python python-3.x iterator
我认为一个简洁的方法是
zipped = zip(list1, list2[n:])
其中n 是一个表示偏移量的整数。
【讨论】:
len(list2) - n 额外的内存才能获得几乎完整的list2 副本,不是吗?
slice 对象。另一方面,切片创建速度很快。
最终,我得到了以下通用函数:
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
上述函数的工作方式类似于generator,它首先填充placeholder 值shift 次,而不是从第二个序列s2 中获取值。之后,它就像zip 一样工作。 yield from 是 relatively new construct(从 Python 3.3 开始)。上面有subtle differences between yield from and return但是这种情况可以忽略。
当然,如果shift 的值几乎为 1(带有占位符的对除外),也可以通过以下方式实现:
zip(s1, next(s2))
与zip 一样,序列不必具有相同的长度。只要较短的序列没有用完,生成器就会工作。
【讨论】: