Как перебрать список списков и получить все элементы один за другим в python? - PullRequest
0 голосов
/ 14 декабря 2018

Мой список, как этот, большой список содержит несколько подсписков с разным размером

test_list = [
             [('c1t1'), ('c1t2'), ('c1t3'), ('c1t4'), ('c1t5')],
             [('c2t1'), ('c2t2'), ('c2t3')],
             [('c3t1'), ('c3t2')],
             [('c4t1'), ('c4t2')],
             [('c5t1')]
                    ]

Я хочу использовать этот список, чтобы создать новый список, подобный этому:

new_list = [('c1t1'), ('c2t1'), ('c3t1'), ('c4t1'), ('c5t1'), 
            ('c1t2'), ('c2t2'), ('c3t2'), ('c4t2'), 
            ('c1t3'), ('c2t3'), 
            ('c1t4'), 
            ('c1t5')]

с правильнымпорядок, как и каждый раз, когда взять первый кортеж из подсписка добавить в новый список.Под «правильным порядком» я подразумеваю уплощение по столбцу.

Ответы [ 5 ]

0 голосов
/ 14 декабря 2018

Несколько сложнее, но работает (возможно, это можно еще упростить):

from functools import partial
from itertools import starmap


def f(i, *args):
    try:
        return args[i]
    except IndexError:
        pass

result = []
for v in (starmap(partial(func, i), test_list) for i in range(0, max([len(l) for l in test_list]))):
    result.extend(n for n in v if n is not None)

Вывод:

[('c1t1',), ('c2t1',), ('c3t1',), ('c4t1',), ('c5t1',), ('c1t2',), 'c2t2',), ('c3t2',), ('c4t2',), ('c1t3',), ('c2t3',), ('c1t4',), ('c1t5',)]
0 голосов
/ 14 декабря 2018

Использование нескольких приемов функционального программирования из модуля itertools:

>>> from itertools import zip_longest, chain
>>> list(filter(lambda x: x, chain(*zip_longest(*test_list))))
['c1t1', 'c2t1', 'c3t1', 'c4t1', 'c5t1', 'c1t2', 'c2t2', 'c3t2', 'c4t2', 'c1t3', 'c2t3', 'c1t4', 'c1t5']
0 голосов
/ 14 декабря 2018

Вы можете использовать рекурсию для достижения этого, сколько бы вложенных слоев не было.
См. Ниже функцию:

def recurflatten(arr):
    if not isinstance(arr, list):
        return arr
    else:
        output = []
        for sy in arr:
            if isinstance(sy, list):
                temp = recurflatten(sy)
                for py in temp:
                    output.append(py)
            else:
                output.append(sy)
        return output

test_list = [
             [('c1t1'), ('c1t2'), ('c1t3'), ('c1t4'), ('c1t5')],
             [('c2t1'), ('c2t2'), ('c2t3')],
             [('c3t1'), ('c3t2')],
             [('c4t1'), ('c4t2')],
             [('c5t1')]
                    ]

new_list =[]
for x in recurflatten(test_list):
    new_list.append((x,))

print (new_list)
# [('c1t1',), ('c1t2',), ('c1t3',), ('c1t4',), ('c1t5',), ('c2t1',), ('c2t2',), ('c2t3',), ('c3t1',), ('c3t2',), ('c4t1',), ('c4t2',), ('c5t1',)]

Редактировать: Если вы не хотите иметь кортежи, вы можете запустить:

print(recurflatten(test_list))
# ['c1t1', 'c1t2', 'c1t3', 'c1t4', 'c1t5', 'c2t1', 'c2t2', 'c2t3', 'c3t1', 'c3t2', 'c4t1', 'c4t2', 'c5t1']
0 голосов
/ 14 декабря 2018

с использованием itertools.zip_longest

test_list = [
         [('c1t1'), ('c1t2'), ('c1t3'), ('c1t4'), ('c1t5')],
         [('c2t1'), ('c2t2'), ('c2t3')],
         [('c3t1'), ('c3t2')],
         [('c4t1'), ('c4t2')],
         [('c5t1')]
                ]

from itertools import zip_longest     
new_list = [(item,) for my_list in zip_longest(*test_list) for item in my_list if item]
print(new_list)

вывод

[('c1t1',), ('c2t1',), ('c3t1',), ('c4t1',), ('c5t1',), ('c1t2',), ('c2t2',), ('
c3t2',), ('c4t2',), ('c1t3',), ('c2t3',), ('c1t4',), ('c1t5',)]

или

new_list = [item for my_list in zip_longest(*test_list) for item in my_list if item]

, если желаемый результат равен

['c1t1', 'c2t1', 'c3t1', 'c4t1', 'c5t1', 'c1t2', 'c2t2', 'c3t2', 'c4t2', 'c1t3',  'c2t3', 'c1t4', 'c1t5']
0 голосов
/ 14 декабря 2018

Вы также можете использовать список понимания:

test_list = [
             [('c1t1'), ('c1t2'), ('c1t3'), ('c1t4'), ('c1t5')],
             [('c2t1'), ('c2t2'), ('c2t3')],
             [('c3t1'), ('c3t2')],
             [('c4t1'), ('c4t2')],
             [('c5t1')]
            ] 
new_list = [item for list2 in test_list for item in list2]     

Выход:

['c1t1', 'c1t2', 'c1t3', 'c1t4', 'c1t5', 'c2t1', 'c2t2', 'c2t3', 'c3t1', 'c3t2', 'c4t1', 'c4t2', 'c5t1']
...