Python:包含单个元素的zip列表

时间:2016-04-10 22:16:30

标签: python list python-3.x

我有一些元素的列表,例如[1, 2, 3, 4]和单个对象,例如'a'。我想生成一个元组列表,列表中的元素位于第一个位置,单个对象位于第二个位置:[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]

我可以使用zip这样做:

def zip_with_scalar(l, o): # l - the list; o - the object
    return list(zip(l, [o] * len(l)))

然而,这给了我一种创造和不必要的重复元素列表的感觉。

另一种可能性是

def zip_with_scalar(l, o):
    return [(i, o) for i in l]

这确实非常干净和pythonic,但在这里我做了整个事情"手动"。在Haskell中,我会做类似

的事情
zipWithScalar l o = zip l $ repeat o

是否存在任何内置函数或技巧,无论是使用标量压缩还是使某些内容能够使用普通zip,即无限列表?

4 个答案:

答案 0 :(得分:3)

这是itertools.cycle课程的完美工作。

from itertools import cycle


def zip_with_scalar(l, o):
    return zip(i, cycle(o))

演示:

>>> from itertools import cycle
>>> l = [1, 2, 3, 4]
>>> list(zip(l, cycle('a')))
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]

答案 1 :(得分:3)

>>> l = [1, 2, 3, 4]
>>> list(zip(l, "a"*len(l)))
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]

答案 2 :(得分:2)

lst = [1,2,3,4]
tups = [(itm, 'a') for itm in lst]
tups

> [(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]

答案 3 :(得分:1)

只需使用无限迭代器定义一个类,该类将使用您要注入列表中的单个元素进行初始化:

class zipIterator:
    def __init__(self, val):
        self.__val = val

    def __iter__(self):
        return self

    def __next__(self):
        return self.__val

,然后从此类和您拥有的列表中创建新列表:

elements = [1, 2, 3, 4]
key = 'a'
res = [it for it in zip(elements, zipIterator(key))]

结果将是:

>>res
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]