小能豆

遍历长度各异的列表内的所有列表

py

我有一个列表列表。它看起来像这样:

[
    [4,7,9,10],
    [5,14,55,24,121,56, 89,456, 678],
    [100, 23, 443, 34, 1243,]
    ....
]

我想要进行迭代,以便在每次迭代中从所有列表中获取该索引的相应元素,如果列表为空,则删除它。

例如,当索引为 0 时,我想要一个列表,该列表将从列表 0 中扩展(添加)4、从列表 1 中扩展(添加)5、从列表 2 中扩展(添加)100(所有列表的第 0 个索引),并且如果列表为空(例如列表 0 将在第 3 次迭代后完全覆盖,则跳过它。因此迭代应该跳过这个列表并转到下一个列表。

因此输出应如下所示:[4,5,100, 7, 14, 23, 9, 55, 443, 10, 24, 34, 121, 1243, 56. 89, 456, 678]

我想要一个扩展这些值的列表。


阅读 20

收藏
2024-11-07

共1个答案

小能豆

zip_longest是有问题的,因为任何解决方案都会在输入中出现时默默地删除fillvalue它(这可以解决,但总是会有点黑客行为)。

最通用的解决方案是roundrobin来自模块itertools配方:

from itertools import cycle, islice

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    num_active = len(iterables)
    nexts = cycle(iter(it).__next__ for it in iterables)
    while num_active:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            # Remove the iterator we just exhausted from the cycle.
            num_active -= 1
            nexts = cycle(islice(nexts, num_active))

对于您的输入,您可以执行以下操作:

mylist = [
    [4,7,9,10],
    [5,14,55,24,121,56, 89,456, 678],
    [100, 23, 443, 34, 1243,]
    ....
]    

print(list(roundrobin(*mylist)))
2024-11-07