我有一些元素的列表,例如[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,即无限列表?
答案 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')]