将两个不均匀的列表与填充要求混合

Sta*_*tus 0 python

我在Python中混合了两个列表,虽然我知道有类似的问题,但我需要以某种方式处理它.

我有两个列表,它们的长度可能相同,也可能不同.我需要交织两者并使用填充物作为较短的列表,但填充物必须在较短列表中的任何值之前.

这就是我目前拥有的:

def mix(a, b):
    fill='spam'
    if len(a) > len(b):
        d = len(a) - len(b)
        while d:
            b.insert(0, fill)
            d-=1
    if len(a) < len(b):
        d = len(b) - len(a)
        while d:
            a.insert(0, fill)
            d-=1

    n = zip(a, b)
    mixed = [item for sub in n for item in sub]
    return mixed
Run Code Online (Sandbox Code Playgroud)

例:

>>> mix([1, 2 ,3], ['A', 'B', 'C', 'D', 'E', 'F'])
['spam', 'A', 'spam', 'B', 'spam', 'C', 1, 'D', 2, 'E', 3, 'F']
Run Code Online (Sandbox Code Playgroud)

所以代码可以工作,但它似乎不是一个好方法.有没有更好的办法?

Kiw*_*iwi 5

如果要将一个元素粘贴到列表中的两个元素上,则可以利用切片.

这是一个可能的实现:

In [39]: l1 = [1,2,3]
    ...: l2 = ['A', 'B', 'C', 'D', 'E', 'F']
    ...: fill = 'spam'
    ...: 

In [40]: l = 2 * max(len(l1), len(l2))  # final length
    ...: mixed = [fill] * l  # result is initialized with the filler
    ...: mixed[l-2*len(l1)::2] = l1  # paste l1
    ...: mixed[l-2*len(l2)+1::2] = l2  # paste l2
    ...: mixed
    ...: 
Out[40]: ['spam', 'A', 'spam', 'B', 'spam', 'C', 1, 'D', 2, 'E', 3, 'F']
Run Code Online (Sandbox Code Playgroud)