我正在尝试增强zip_with_scalar
的逻辑。我正在尝试使用 vector
到目前为止,我已经实现了这一目标-
import itertools
def zip_with_vector(l, o):
if not isinstance(o, list):
return zip(l, itertools.repeat(o))
else:
for e in o:
l = list(zip_with_vector(l, e))
return l
print(list(zip_with_vector(['a', 'b', 'c'], ['x', 'y', 'z'])))
>>> [((('a', 'x'), 'y'), 'z'), ((('b', 'x'), 'y'), 'z'), ((('c', 'x'), 'y'), 'z')]
但是我想要这个[('a', 'x', 'y', 'z'), ('b', 'x', 'y', 'z'), ('c', 'x', 'y', 'z')]
我知道我已经接近,但无法弄清楚递归逻辑。
答案 0 :(得分:4)
如果要序列“输入列表的每个元素,并与输入向量连接”,则只需写:
def zip_with_vector(l, v):
return ((elem,) + tuple(v)
for elem in l)
list(zip_with_vector(['a', 'b', 'c'], ['x', 'y', 'z']))
>>> [('a', 'x', 'y', 'z'), ('b', 'x', 'y', 'z'), ('c', 'x', 'y', 'z')]
如果这确实是您要查找的内容,那么我认为这里不需要递归。
正如@Georgy在评论中提到的那样,这样可以写得更简洁(可能执行得更快):
def zip_with_vector(l, v):
return ((elem, *v) for elem in l)
答案 1 :(得分:2)
您可以通过将zip_with_vector
映射到向量的每个元素来将zip_with_scalar
扩展到itertools.repeat
:
def zip_with_vector(iterable, vector):
return zip(iterable, *map(itertools.repeat, vector))
>>> list(zip_with_vector(['a', 'b', 'c'], ['x', 'y', 'z']))
[('a', 'x', 'y', 'z'), ('b', 'x', 'y', 'z'), ('c', 'x', 'y', 'z')]