包含几个元素的邮政编码列表

时间:2019-07-14 10:05:07

标签: python list itertools

我正在尝试增强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')]

我知道我已经接近,但无法弄清楚递归逻辑。

2 个答案:

答案 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')]