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

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)


ahm*_*med 9

您可以使用内置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)


Pad*_*ham 6

您还可以将zip_longestfillvalueof一起使用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 还是重复,都不会复制用于的任何可变值。


sty*_*ane 5

这对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)

  • “cycle” 的参数必须是可迭代的,不是吗?它适用于 ``'a'`` 因为它是字符串,但不适用于任意对象。 (2认同)

kzt*_*ztd 5

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)