Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Loops Aninhados (nested loops) desafio

Bom dia, boa tarde, boa noite! Gente, estou tentando completar um desafio em que devo rotacionar uma matriz conforme segue abaixo:



'''
matriz original:
1,2,3  matrix[0][0] matrix[0][1] matrix[0][2]
4,5,6  matrix[1][0] matrix[1][1] matrix[1][2]
7,8,9  matrix[2][0] matrix[2][1] matrix[2][2]
rotaciona sentido horário, 
nova matriz:
7,4,1  matrix[2][0] matrix[1][0] matrix[0][0]
8,5,2  matrix[2][1] matrix[1][1] matrix[0][1]
9,6,3  matrix[2][2] matrix[1][2] matrix[0][2]

'''

escrevi a função abaixo mas o resultado sai errado

def rotate(matrix,direction):
    matrix2 = matrix
    for linha in matrix:
        l = matrix.index(linha)
        for coluna in linha:
            c = linha.index(coluna)
            if direction == "clockwise":
                matrix2[l][c] = matrix[((len(matrix)-1) - c)][l]
                #aqui mandei imprimir a linha e coluna para visualisar onde estava o erro:
                print(f'linha: {(len(matrix)-1-c)}, coluna: {l}')

    return matrix2

    print(rotate([[1,2,3],[4,5,6],[7,8,9]],"clockwise"))

com a matriz dada [[1,2,3],[4,5,6],[7,8,9]] o resultado que o programa cospe é [[7, 4, 7], [8, 5, 4], [9, 4, 9]] quando deveria ser [[7,4,1],[8,5,2],[9,6,3]]

alguém tem alguma idéia de porque os índices saem trocados?

4 respostas
solução!

Boa noite Fernanda, eu resolvi desta forma.

def rotate(matrix,direction):
        if direction == "clockwise":
            tuples = zip(*matrix)
            lista_rotacionada = [[z, y, x] for x, y, z in tuples]
            print(lista_rotacionada)

Espero ter ajudado!

Márcio, é uma ótima solução, agradeço. Mas você tem ideia de porque meu código não funciona e ele erra os indices?

Boa tarde Fernanda, a primeira coisa que percebi é que matrix2 aponta para o mesmo objeto matrix. Se fosse uma única lista, tu poderias fazer

matrix2 = matrix.copy()

mas como existem três listas dentro de matrix, isto também não vai funcionar. Eu resolvi dessa forma mas não sei se é a mais elegante.

matrix2 = []
        for _ in range(len(matrix)):
            matrix2.append([])

O outro problema que identifiquei foi na atribuição de uma matrix para outra.

matrix2[l][c] = matrix[((len(matrix)-1) - c)][l]

Segue o código correto:

def rotate(matrix,direction):
        matrix2 = []
        for _ in range(len(matrix)):
            matrix2.append([])
        for linha in matrix:
            l = matrix.index(linha)
            for coluna in linha:
                c = linha.index(coluna)
                if direction == "clockwise":
                    matrix2[c].append(matrix[len(matrix)-1 - l][c])
                    #aqui mandei imprimir a linha e coluna para visualisar onde estava o erro:
                    #print(f'linha: {(len(matrix)-1-c)}, coluna: {l}')

        return matrix2
print(rotate([[1,2,3],[4,5,6],[7,8,9]],"clockwise"))

Abraço!

Márcio, valeu demais! Era esse meu raciocínio mesmo. Muito obrigada!