python - есть ли способ использовать понимание списка для создания списка на основе извлеченных общих индексов подсписок? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь найти чистый способ получить элементы с одинаковым индексом каждого подсписка и создать новый список на основе этих извлеченных элементов, поэтому сначала мне нужен подсписок, содержащий элемент 0 каждого предыдущего подсписка, а затем то же то же самое для элемента 1, 2 и т. д. c. На данный момент я использую следующий код для получения желаемых результатов:

lst = [[1, 2, 3, 4], ['a', 'b', 'c', 'd'], [True, True, False, True], [14.5, 15.6, 12.5, 12.3]]
approach_1 = []

for i, item in enumerate(lst[0]):
    approach_1.append([item, lst[1][i], lst[2][i], lst[3][i]])

, что дает мне

approach_1 = [[1, 'a', True, 14.5], [2, 'b', True, 15.6], [3, 'c', False, 12.5], [4, 'd', True, 12.3]]

Результаты - это то, что я ищу, но есть ли способ для меня, чтобы добиться этого в одну строчку? Я могу использовать для одного элемента следующее:

approach_2 = [x[0] for x in lst] 

Есть ли что-нибудь похожее на это, что вернет те же результаты, что и подход_1?

Ответы [ 4 ]

1 голос
/ 29 мая 2020

Решение с пониманием списка:

[list(i) for i in zip(*lst)]

# [[1, 'a', True, 14.5], [2, 'b', True, 15.6], [3, 'c', False, 12.5], [4, 'd', True, 12.3]]

Или, используя map

list(map(list, zip(*lst)))

, вы получите тот же результат

1 голос
/ 29 мая 2020

Встроенная функция zip делает именно то, что вы хотите:

>>> lst = [[1, 2, 3, 4], ['a', 'b', 'c', 'd'], [True, True, False, True], [14.5, 15.6, 12.5, 12.3]]
>>> list(zip(*lst))
[(1, 'a', True, 14.5), (2, 'b', True, 15.6), (3, 'c', False, 12.5), (4, 'd', True, 12.3)]
0 голосов
/ 29 мая 2020
list( zip( lst[0], lst[1], lst[2], lst[3] ) )

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

result = [ list(x) for x in list( zip( lst[0], lst[1], lst[2], lst[3] ) ) ]
0 голосов
/ 29 мая 2020

Вы можете написать два цикла for в одной строке!

new_list = [[j[i] for j in lst] for i in range(0, len(lst[0]))]
...