简体   繁体   中英

Take elements from multiple lists

Given multiple lists like the ones shown:

a = [1, 2, 3]
b = [5, 6, 7, 8]
c = [9, 0, 1]
d = [2, 3, 4, 5, 6, 7]
...

I want to be able to combine them to take as many elements from the first list as I can before starting to take elements from the second list, so the result would be:

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

Is there a particularly nice way to write this? I can't think of a really simple one without a for loop. Maybe a list comprehension with a clever zip .

Simple slicing and concatenation:

a + b[len(a):]

Or with more lists:

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

With itertools.zip_longest() for Python 3, works on any number of input lists:

>>> 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]

The default fill value is None so take the first none None element in each tuple created with the zip_longest call (you can change the defaults and criteria if None is a valid data value)

With functools.reduce :

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

This outputs:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM