Entendendo 2D list slicing

Essa tentativa de fatiar essa matriz retorna as duas primeiras listas separadamente:

[0, 0, 0, 0, 0]
[0, 12, 11, 10, 0]

Eu queria entender como o for loop está funcionando nesse caso… alguém poderia me explicar?
Eu estava esperando as primeiras duas colunas de cada uma das listas, como se o for loop retornasse os indexes
0,0
0,1
1,0
1,1
2,0
2,1
3,0
3,1
4,0
4,1
5,0
5,1
( valores 0,0,0,12,0,9,0,6,0,3,0,0 )

Obs: Eu nao estou procurando o jeito certo de conseguir os 2 primeiros valores das listas, isso eu já consegui… só estou tentando entender como o for funciona com essa syntaxe do slicing nesse caso

matrix = [     
    [0,0,0,0,0],
    [0,12,11,10,0], 
    [0,9,8,7,0],
    [0,6,5,4,0],
    [0,3,2,1,0],
    [0,0,0,0,0]
    ]

for value in matrix[0:6][0:2]:
    print(value)

Obrigada!

1 curtida

Vamos por partes.

Um slice representa um “pedaço” da lista. Os números indicam os índices de início e fim (com o detalhe que o final não é incluso).

Por exemplo, [0:6] indica que o slice começa no índice 0 e termina no 5 (lembre-se, o final não é incluso). Exemplo:

lista = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(lista[0:6]) # [0, 1, 2, 3, 4, 5]

Ou seja, [0:6] pega os índices de 0 a 5, e retorna uma lista contendo esses elementos. E como os índices de uma lista começam em zero, então o resultado são os 6 primeiros elementos da lista.


No caso da sua matriz, ela na verdade é uma lista de listas (uma lista cujos elementos são outras listas):

matrix = [ # matrix é uma lista, cujos elementos também são listas
    [0,0,0,0,0],    # primeiro elemento da matriz
    [0,12,11,10,0], # segundo elemento da matriz
    [0,9,8,7,0],    # terceiro elemento da matriz
    [0,6,5,4,0],    # quarto elemento da matriz
    [0,3,2,1,0],    # quinto elemento da matriz
    [0,0,0,0,0]     # sexto elemento da matriz
]

E como a matriz tem 6 elementos, então matrix[0:6] acaba sendo o mesmo que toda a matriz:

matrix = [     
    [0,0,0,0,0],
    [0,12,11,10,0], 
    [0,9,8,7,0],
    [0,6,5,4,0],
    [0,3,2,1,0],
    [0,0,0,0,0]
]

print(matrix[0:6]) # imprime a matriz inteira
print(matrix) # veja que mostra a mesma coisa do print acima

Em seguida, o slice [0:2] pega os dois primeiros elementos dessa matriz. Mas como já vimos que matrix[0:6] está pegando toda a matriz, então matrix[0:6][0:2] acaba sendo o mesmo que matrix[0:2]:

# ambos imprimem os 2 primeiros elementos da matriz (as 2 primeiras listas)
print(matrix[0:6][0:2]) # [[0, 0, 0, 0, 0], [0, 12, 11, 10, 0]]
print(matrix[0:2])      # [[0, 0, 0, 0, 0], [0, 12, 11, 10, 0]]

Ou seja, o seu for está iterando pelos dois primeiros elementos da matriz (que no caso, são as listas [0, 0, 0, 0, 0] e [0, 12, 11, 10, 0]).


Se você só quer as duas primeiras colunas de cada linha, então na verdade você precisa pegar o slice de cada uma delas separadamente:

for linha in matrix:
    print(linha[0:2])
2 curtidas

Linda essa resposta!! Muito obrigada, eu entendi perfeitamente!
Eu tinha me confundindo com a sintaxe [][] achando que ele ia retornar valores individuais mas na verdade ocorrem 2 slicing.

Mais uma vez obrigada!

1 curtida