Понимание списка для объединения элементов подсписков по столбцам - PullRequest
1 голос
/ 16 мая 2019

У меня есть список списков, таких как:

allrows = [['NEPW46486', 'NEPW46550', 'sersic', 20.04, 21.12],
['NEPW89344', 'NEPW89346', 'sersic', 20.33, 19.66], ...]

И я хотел бы создать новый список списков, где каждый список соответствует одному «столбцу». Мой желаемый вывод:

cols = [['NEPW46486', 'NEPW89344', ...], ['NEPW46550', 'NEPW89346', ...], ['sersic', 'sersic', ...], [20.04, 20.33, ...], [21.12, 19.66, ...]]

Я подумал, что смогу сделать это с помощью понимания списка, например:

cols = [[row[n] for row in allrows] for n in range(len(row))]

Но я получаю NameError, который row не определен. Я также попытался изменить порядок своих операторов цикла, но это не дало мне желаемого результата (вместо этого он дал мне именно то, с чего я начал). Как мне достичь желаемого результата с помощью понимания списка?

Ответы [ 3 ]

2 голосов
/ 16 мая 2019

Вы можете сделать это в понимании списка, используя встроенную функцию zip(), например:

allrows = [['NEPW46486', 'NEPW46550', 'sersic', 20.04, 21.12],
           ['NEPW89344', 'NEPW89346', 'sersic', 20.33, 19.66],]

cols = [list(col) for col in zip(*allrows)]

Результат:

[['NEPW46486', 'NEPW89344'], ['NEPW46550', 'NEPW89346'], ['sersic', 'sersic'], [20.04, 20.33], [21.12, 19.66]]

Это иногда называют " транспонированием " (что означает обмен столбцами для строк) двумерной матрицей значений.

1 голос
/ 16 мая 2019

Это цель встроенной функции zip. Вам просто нужно распаковать свои списки, как вы это называете Что-то вроде:

allrows = [['NEPW46486', 'NEPW46550', 'sersic', 20.04, 21.12],
           ['NEPW89344', 'NEPW89346', 'sersic', 20.33, 19.66]]

for item in zip(*allrows): # unpack with *allrows
    print(item)

Сетей:

('NEPW46486', 'NEPW89344')
('NEPW46550', 'NEPW89346')
('sersic', 'sersic')
(20.04, 20.33)
(21.12, 19.66)

Если по какой-то причине zip() неудовлетворительно, для понимания списка обычно проще всего создать реальную структуру кода, а затем сжать ее. Начиная с:

cols = []
for index, item in enumerate(allrows[0]):
    col = []
    for row in allrows:
        col.append(row[index])
    cols.append(col)
print(cols)

Получаем желаемое

[['NEPW46486', 'NEPW89344'], ['NEPW46550', 'NEPW89346'], ['sersic', 'sersic'], [20.04, 20.33], [21.12, 19.66]]

Итак, мы можем просто сжать его до одной строки, например:

cols = [[row[index] for row in allrows] for index, item in enumerate(allrows[0])]
print(cols)

Что снова дает:

[['NEPW46486', 'NEPW89344'], ['NEPW46550', 'NEPW89346'], ['sersic', 'sersic'], [20.04, 20.33], [21.12, 19.66]]

0 голосов
/ 18 мая 2019

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

list(zip(*allrows))  # python 3

или

zip(*allrows)  # python 2
...