-3
def over(xs,ys):

我如何使用 xs 的第一个值、ys 的第一个值、xs 的第二个值、ys 的第二个值等创建一个新列表。

例子

([1,2,3], ["hi", "bye",True, False, 33]) ===> [1, "hi", 2, "bye", 3, True, False, 33]
4

2 回答 2

4

在 Python 2.X 上:

>>> data = ([1,2,3], ["hi", "bye",True, False, 33])
>>> [x for t in map(None, *data) for x in t if x is not None]
[1, 'hi', 2, 'bye', 3, True, False, 33]

在 Python 3.x 上:

>>> from itertools import zip_longest
>>> data = ([1,2,3], ["hi", "bye",True, False, 33])
>>> [x for t in zip_longest(*data) for x in t if x is not None]
[1, 'hi', 2, 'bye', 3, True, False, 33]

回答评论问题:

您绝对应该毫不犹豫地使用 itertools / zip_longest。但是,如果您想好奇:

def oldMapNone(*ells):
    '''replace for map(None, ....), invalid in 3.0 :-( '''
    lgst=len(max(ells, key=len))
    return list(zip(*[list(e) + [None] * (lgst - len(e)) for e in ells]))

data = ([1,2,3], ["hi", "bye",True, False, 33])
print([x for t in oldMapNone(*data) for x in t if x is not None])
# [1, 'hi', 2, 'bye', 3, True, False, 33]

适用于任一 Python 版本。但是,我不能推荐它优先于 itertools 版本。

于 2013-11-09T04:49:56.920 回答
0
>>> l1
[1, 2, 3]
>>> l2
['hi', 'bye', True, False, 33]
>>> 
>>> 
>>> while l1 or l2:
...     if l1: l1.pop(0)
...     if l2: l2.pop(0)
... 
1
'hi'
2
'bye'
3
True
False
33
于 2013-11-09T06:38:35.637 回答