我有一个列表列表。它看起来像这样:
[ [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]
[4,5,100, 7, 14, 23, 9, 55, 443, 10, 24, 34, 121, 1243, 56. 89, 456, 678]
我想要一个扩展这些值的列表。
zip_longest是有问题的,因为任何解决方案都会在输入中出现时默默地删除fillvalue它(这可以解决,但总是会有点黑客行为)。
zip_longest
fillvalue
最通用的解决方案是roundrobin来自模块itertools的配方:
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)))