zeg*_*jan 19 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)))
Run Code Online (Sandbox Code Playgroud)
然而,这给了我一种创造和不必要的重复元素列表的感觉.
另一种可能性是
def zip_with_scalar(l, o):
return [(i, o) for i in l]
Run Code Online (Sandbox Code Playgroud)
这确实非常干净和pythonic,但在这里我做"手动"整个事情.在Haskell中,我会做类似的事情
zipWithScalar l o = zip l $ repeat o
Run Code Online (Sandbox Code Playgroud)
是否有任何内置函数或技巧,无论是用于标量的压缩还是用于使我能够使用普通zip的东西,即排序无限列表?
kir*_*sos 31
这是您的Haskell解决方案的最佳内容:
import itertools
def zip_with_scalar(l, o):
return zip(l, itertools.repeat(o))
Run Code Online (Sandbox Code Playgroud)
您也可以使用生成器,这样可以避免创建类似于理解的列表:
def zip_with_scalar(l, o):
return ((i, o) for i in l)
Run Code Online (Sandbox Code Playgroud)
您可以使用内置map功能:
>>> elements = [1, 2, 3, 4]
>>> key = 'a'
>>> map(lambda e: (e, key), elements)
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]
Run Code Online (Sandbox Code Playgroud)
小智 7
>>> l = [1, 2, 3, 4]
>>> list(zip(l, "a"*len(l)))
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]
Run Code Online (Sandbox Code Playgroud)
您还可以将zip_longest与fillvalueof一起使用o:
from itertools import zip_longest
def zip_with_scalar(l, o): # l - the list; o - the object
return zip_longest(l, [o], fillvalue=o)
print(list(zip_with_scalar([1, 2, 3, 4] ,"a")))
Run Code Online (Sandbox Code Playgroud)
请注意,o无论使用 zip_longest 还是重复,都不会复制用于的任何可变值。
这对itertools.cycle班级来说是一项完美的工作。
from itertools import cycle
def zip_with_scalar(l, o):
return zip(i, cycle(o))
Run Code Online (Sandbox Code Playgroud)
演示:
>>> from itertools import cycle
>>> l = [1, 2, 3, 4]
>>> list(zip(l, cycle('a')))
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]
Run Code Online (Sandbox Code Playgroud)
lst = [1,2,3,4]
tups = [(itm, 'a') for itm in lst]
tups
> [(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]
Run Code Online (Sandbox Code Playgroud)