def transpose(matrix):
    n=0
    while n < (len(matrix)):
        li = []
        for sets in matrix:
            li.append(sets[0])
        n += 1
        print(len(matrix))
        return li
transpose([[1,2,3],[4,5,6],[7,8,9]])

В настоящее время возвращает [1,4,7] Требуемый результат [[1,4,7], [2,5,8], [3,6,9]]

0
james_weasel 13 Янв 2017 в 00:41

4 ответа

Лучший ответ

В вашем while есть оператор return, поэтому функция возвращается, как только достигает этой точки. Вы должны dedent вернуться на тот же уровень, что и while:

def transpose(matrix):
    n = 0
    li = []
    while n < (len(matrix)):
        ...
    return li

Вы также можете заменить цикл while и счетчик n на цикл for, который повторяется в range(len(matrix)), так что вы можете безопасно отбросить n, а затем переместить инициализацию li за пределы цикл :

def transpose(matrix):
    li = []
    for i in range(len(matrix)):
        inner_li = []
        for sets in matrix:
            inner_li.append(sets[i])
        li.append(inner_li)
    return li

Я предлагаю вам принять популярный рецепт для транспонирования матриц, чтобы сделать ваш код чище:

def transpose(matrix):
    return list(zip(*matrix))

>>> transpose([[1,2,3],[4,5,6],[7,8,9]])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
6
Moses Koledoye 12 Янв 2017 в 22:06

Отступы имеют значение. Кроме того, список li инициализируется не в том месте.

def transpose(matrix):
    n=0
    li = []

    while n < (len(matrix)):
        for sets in matrix:
            li.append(sets[0])
        n += 1
        print(len(matrix))
    return li
1
e4c5 12 Янв 2017 в 21:44

Ваша первая ошибка - отступ return. Второй имеет 0 вместо n в sets[...]. Третий - перезаписывать значение li в каждом цикле while. Вот как это работает:

def transpose(matrix):
    n=0
    li = []
    while n < (len(matrix)):
        li.append([])
        for sets in matrix:
            li[-1].append(sets[n])
        n += 1
        print li
    return li


transpose([[1,2,3],[4,5,6],[7,8,9]])

Не беспокойся об этом. Вы станете быстрее и менее подвержены ошибкам очень быстро, если вам интересно, и попробуйте :)

0
yogabonito 12 Янв 2017 в 22:17

Я полагаю, вы знаете это, но на всякий случай, это может быть достигнуто с NumPy

import numpy as np
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
print A.T
1
Michael Ellner 12 Янв 2017 в 21:51