Introdução à programação e aos algoritmos
5.6 Extraindo Sublistas
EXERCÍCIO 5.11
Escreva um programa que dada a lista [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] gere a lista [5, 6,
7, 8, 9, 0, 1, 2, 3, 4].
EXERCÍCIO 5.12
Escreva um programa que dada a lista [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] gere a lista [1, 3,
5, 7, 9, 0, 2, 4, 6, 8].
5.6 EXTRAINDO SUBLISTAS
Se você quiser manipular apenas uma parte de uma lista, Python oferece recursos bem práticos para que se tenha acesso facilmente a trechos específicos da lista. Estas partes são chamadas de sublistas ou fatias.
A forma geral para fatiar uma lista é usar o nome da lista e
colocar a fatia desejada entre colchetes. A fatia é representada por um par de índices separados por dois pontos:
[i:f:p]
Explicando cada um desses parâmetros:
i : início é o índice inicial cujo elemento será incluído na fatia
resultante, exceto se seu valor for o mesmo que fim. Quando o valor é negativo, significa que indica uma contagem a partir do final, o -1 indicando o último elemento da lista. O valor por omissão é zero.
f : fim indica o fim da fatia. O valor nesta posição da lista não
entra na fatia resultante. Também pode ser negativo. O valor por omissão é o tamanho da lista e a fatia resultante inclui o último elemento da lista.
p : passo valor de incremento a partir do índice inicial. Se for negativo, conta do final para o início da lista. O valor por omissão é 1 .
Todos os índices devem ser válidos e qualquer expressão inteira pode ser usada. Contudo, atenção: o primeiro elemento da nova fatia é efetivamente aquele com índice i, porém o último elemento da fatia será o de índice f-1. A ausência de um dos índices indica que o intervalo é aberto, assim: [i:] engloba todos os elementos entre o índice i e o final da lista, enquanto [:f] toma todos os elementos entre o início da lista e o índice f-1. O passo p é opcional e indica o incremento a partir do índice inicial.
Os valores-padrão, quando omitidos qualquer um dos valores são i = 0, f = tamanho da lista e p = 1.
Considere uma lista de nomes de planetas:
planetas = [
‘Mercúrio’, ‘Vênus’, ‘Terra’, ‘Marte’, ‘Saturno’
,
‘Júpiter’, ‘Urano’, ‘Netuno’
]
O Programa 5.20 mostra o resultado do fatiamento de uma lista e, por enquanto, usa o valor-padrão para o passo, ou seja, 1.
planetas = [
‘Mercúrio’, ‘Vênus’, ‘Terra’, ‘Marte’, ‘Saturno’
,
‘Júpiter’, ‘Urano’, ‘Netuno’
]
print(planetas[2:5])
print(planetas[:3])
print(planetas[3:])
print(planetas[4:-1])
print(planetas[:])
■ Programa 5.20: Programa de fatiamento de lista sem passo.
O resultado será:
[‘Terra’, ‘Marte’, ‘Saturno’]
[‘Mercúrio’, ‘Vênus’, ‘Terra’]
[‘Marte’, ‘Saturno’, ‘Júpiter’, ‘Urano’, ‘Netuno’]
[‘Saturno’, ‘Júpiter’, ‘Urano’]
[‘Mercúrio’, ‘Vênus’, ‘Terra’, ‘Marte’, ‘Saturno’, ‘
Júpiter’,
‘Urano’, ‘Netuno’]
A primeira fatia engloba os elementos de índices 2, 3 e 4; a
segunda fatia toma os elementos 0, 1 e 2; a terceira fatia pega os elementos de índices 3, 4, 5, 6 e 7; a quarta lista, os elementos de índices 4, 5 e 6. Lembre-se de que -1 representa o último elemento da lista, no caso, o de índice 7. Com isto, a expressão equivale a [4:7]. Finalmente, quando os dois índices estão ausentes, a referência é a lista inteira.
Este fatiamento permite operações poderosas sobre as listas. O
programa 5.21 apresenta algumas opções, neste ponto incluindo o passo do fatiamento. As possibilidades são inúmeras para manipulação de uma lista com este tipo de operação. Teste algumas outras opções para entender o mecanismo.
primos = [2, 3, 13, 17, 19]
print(‘Lista completa: ‘, primos[:])
print(‘Lista de 2 em 2, começando em 0: ‘, primos[::
2])
print(‘Lista de 3 em 3, começando em 0: ‘, primos[::
3])
primos[2:2] = [5, 7]
primos[4:4] = [11]
print(‘Lista completa: ‘, primos[:])
print(‘Lista de 2 em 2, começando em 3: ‘, primos[3:
:2])
print(‘Lista de 2 em 2, terminando em 4: ‘, primos[:
5:2])
primos[2:3] = []
print(‘Retira 1 elemento da posição 2: ‘, primos)
primos[::2] = [3, 11, 17, 23]
print(‘Substitui 4 elementos: ‘, primos) primos[::2] = [2, 7, 13, 19]
primos[2:2] = [5]
print(‘Reinserindo elementos: ‘, primos[:])
■ Programa 5.21: Operações de fatiamento de uma lista.
O resultado da execução do programa de fatiamento de lista é:
Lista completa: [2, 3, 13, 17, 19] Lista de 2 em 2, começando em 0: [2, 13, 19] Lista de 3 em 3, começando em 0: [2, 17] Lista completa: [2, 3, 5, 7, 11, 13, 17, 19] Lista de 2 em 2, começando em 3: [7, 13, 19] Lista de 2 em 2, terminando em 4: [2, 5, 11] Retira 1 elemento da posição 2: [2, 3, 7, 11, 13, 1 7, 19]
Substitui 4 elementos: [3, 3, 11, 11, 17, 17, 23] Reinserindo elementos: [2, 3, 5, 7, 11, 13, 17, 19]
Um resumo das operações de fatiamento é mostrado na Tabela
5.1.
Tabela 5.1 Resumo de fatiamento de listas
Fatia Resultado
[:] ou [::] todos os elementos
[i::] todos os elementos de i até o último
[:f:] todos os elementos até f – 1
[i:f:] todos os elementos de i até f – 1
[::p] todos os elementos até f – 1, com p de distância entre esses elementos
[i::p] todos os elementos de i até f – 1, com p de distância entre esses
elementos
[:f:p] todos os elementos do primeiro até f – 1, com p de distância entre esses
elementos
[i:f:p] toma os elementos da lista, começando em i até f – 1, com p de
distância entre esses elementos
Se o valor do passo é negativo, a ordem é invertida, pois
estaremos contando de trás para a frente. A Tabela 5.2 resume esses casos.
Tabela 5.2 Resumo de fatiamento de listas com índices negativos
Fatia Resultado
[::-p] todos os elementos do último até o primeiro, com p de distância entre
esses elementos
[i::-p] todos os elementos de i até o início, com p de distância entre esses
elementos
[:f:-p] todos os elementos do último até f + 1, com p de distância entre esses
elementos
[i:f:-p] engloba os elementos da lista, começando em i até f + 1, com p de
distância entre esses elementos
Veja o Programa 5.22 que demonstra o uso de passo negativo na operação de fatiamento em Python.
lista = [0,1,2,3,4,5,6,7,8,9]
print(lista[::-1])
print(lista[4::-1])
print(lista[:5:-1])
print(lista[5:2:-1])
■ Programa 5.22: Programa de fatiamento de lista com passo
negativo.
O resultado é:
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[4, 3, 2, 1, 0]
[9, 8, 7, 6]
[5, 4, 3]
EXERCÍCIO 5.13
Dada a lista [10, 2, 32, 14, 35, 46, 17, 58, 199, 19], escreva um programa que
imprima:
1. os elementos de índices pares;
2. os elementos de índices ímpares;
3. os elementos entre os índices 2 (inclusive) e 4 (exclusive);
4. o elemento de índice 1 e depois os elementos distantes 3 posições a partir de
1, até o nal.
EXERCÍCIO 5.14
Gere uma lista com 100 números de 0 a 99, com o comando range() e,
usando valores negativos no fatiamento, escreva um programa que imprima:
1. o último elemento da lista original e depois, decrescendo, os elementos
distantes 3 posições a partir do nal até o início;
2. os elementos entre o índice 87 (inclusive) e o índice 34 (exclusive), em ordem
decrescente de índices;
3. todos os elementos, exceto os dois últimos.
EXERCÍCIO 5.15
Dada a lista [1, 2, 3, 4, 5, 6, 7], imprima seu inverso, ou seja, [7, 6, 5, 4, 3, 2, 1]
usando apenas fatiamento.
EXERCÍCIO 5.16
Considere a lista
planetas = [‘Mercúrio’, ‘Vênus’, ‘Terra’,
‘Marte’, ‘Saturno’, ‘Júpiter’, ‘Urano’,
‘Netuno’].
Execute as seguintes operações usando apenas fatiamento. Cada item usa a lista
resultante do item anterior.