Python 从多个列表中获取元素

Python 从多个列表中获取元素,python,list,Python,List,给定多个列表,如图所示: a = [1, 2, 3] b = [5, 6, 7, 8] c = [9, 0, 1] d = [2, 3, 4, 5, 6, 7] ... 在开始从第二个列表中获取元素之前,我希望能够将它们组合起来,从第一个列表中获取尽可能多的元素,因此结果将是: result = [1, 2, 3, 8, 6, 7] 有没有特别好的方法来写这个?如果没有for循环,我想不出一个真正简单的方法。也许是一个聪明的zip简单的切片和拼接的列表理解: a + b[len(a):]

给定多个列表,如图所示:

a = [1, 2, 3]
b = [5, 6, 7, 8]
c = [9, 0, 1]
d = [2, 3, 4, 5, 6, 7]
...
在开始从第二个列表中获取元素之前,我希望能够将它们组合起来,从第一个列表中获取尽可能多的元素,因此结果将是:

result = [1, 2, 3, 8, 6, 7]

有没有特别好的方法来写这个?如果没有
for
循环,我想不出一个真正简单的方法。也许是一个聪明的
zip
简单的切片和拼接的列表理解:

a + b[len(a):]
或具有更多列表:

res = []
for lst in (a, b, c, d):
    res += lst[len(res):]
# [1, 2, 3, 8, 6, 7]

使用Python 3的
itertools.zip_longest()
,可以处理任意数量的输入列表:

>>> from itertools import zip_longest
>>> [next(x for x in t if x is not None) for t in zip_longest(a,b,c,d)]
[1, 2, 3, 8, 6, 7]

默认的填充值是
None
,因此在使用
zip\u longest
调用创建的每个元组中使用第一个None
None
元素(如果
None
是有效的数据值,则可以更改默认值和条件)

使用
functools。reduce

from functools import reduce
print(list(reduce(lambda a, b: a + b[len(a):], [a, b, c, d])))
这将产生:

[1, 2, 3, 8, 6, 7]

哦,好的。是的,我的问题中没有包括这个。但是我想要一个解决方案,它可以处理您提供的尽可能多的列表。但这绝对符合我的要求(doh!)我最好编辑一下。是的,这真是天才!谢谢你:D我不得不停下来一段时间,才意识到它在做什么。抱歉,所以
c
必须被完全排除在外?它们必须都是单独的列表吗?或者输入可以是列表的列表吗?你可以让它们成为列表的列表,或者对我有用:PI就像这个方法,但是所有元组的综合生成
t
使得这一点很难执行,因为所有列表的所有元素都被一次触摸。@schwobasegll它可能比您的解决方案慢,但如果不在不同的数据集上计时,很难确定您的解决方案(我也喜欢)也有
len()
调用和较慢的
循环等。当然,需要测试,可能取决于实际数据。然而,从算法上讲,我的应该是
O(L)
(L是最长列表的长度),因为切片和扩展是
O(k)
(k是切片/扩展的长度),而
len
O(1)
。你的应该是
O(N*L)
。尽管如此,“在给定的索引中获取第一个现有元素”的基本思想还是得到了很好的反映。@Schwobasegll同意!一个小的变化:
[next(过滤器(None.\uu-ne\uu,t))用于zip中的t最长(*src)]
;)由于循环扩展了结果列表,schwobaseggl的版本效率更高。而像这样使用
reduce
会为每个临时结果创建一个新的列表对象。这类似于执行
求和(x,[])
;看看为什么这样不好。