Listos e listas

Antes en Python :

  • bucles
  • datos estruturados
  • listas

Dada a importancia do traballo con listas en Python (e en xeral con datos estruturados lineais: tuplas, diccionarios, conxuntos...) facemos esta páxina para repasar o aprendido sobre listas no bloque Despois de Scratch e tamén aprender cousas novas, pero agora sen facer referencia a Scratch. As listas serán moi importantes nos exercicios de Python propostos nas seguintes páxinas, polo que convén dominalas.

Modificar unha lista: iterando por elementos ou por índices

Dada unha lista é moi probable que queremos consultala (mostrar como saída os seus elementos en orde) ou aplicar unhas operacións sobre os datos. Xa vimos anteriormente que iso podemos facelo con un bucle for, pero imos repasalo para telo presente.

numeros = [1,2,3,4,5]

Supoñamos que para esa lista queramos usar o doble de cada número (neste tipo de exercicio sempre convén ter presente que nun caso real a lista pode ter decenas, centos ou miles de números):

for numero in numeros:

numero = numero*2

print(numero) #isto para ver a saída do bucle

print(numeros) #isto para ver a lista despois do bucle

Que acontece coa saída e coa lista, e POR QUE?. Intenta anticipalo durante 3 segundos se queres aprender antes de ver a solución...

1,2,3...Xa?

Pois que teremos a lista igual, non está modificada. Fixemos unha consulta que deixa a lista igual, sen modificar.


Saida do código en repl.it

Por que acontece isto?. Pois por que estamos a copiar os elementos cando usamos o bucle for, iterando sobre os elementos.

 Cada quevez que consultamos un elemento, almacenámolo na variable numero, facemos unha copia, pero deixamos a lista igual.

Como podemos facer unha lista cos números novos?. Temos varias posibilidades, a máis elemental é crear unha lista nova e usar o método append(), que permite inserir elementos nunha lista

novos_numeros =[]

for numero in numeros:

numero = numero*2

novos_numeros.append(numero)

Agora proba a escribir:

print(numeros)

print(novos_numeros)

e verás a diferenza entre as listas. E se desexamos que a lista nova se chame igual que a anterior (é decir, remplazala)?. Pois nada, facemos isto:

numeros = novos_numeros #con isto borramos a lista orixinal, remplazada pola nova (proba a executar print(numeros))

Podemos facelo máis simple, con máis elegancia (elegancia e lexibilidade son os superpoderes de Python)?. Si, iterando sobre o índice:

for indice in range(len(numeros)):

numeros[indice] = numeros[indice]*2

Estamos a utilizar dous métodos: len() para saber a lonxitude da lista, e range() para facer o bucle dende 0 ata o número de elementos menos 1 (lembra que os índices comenza en 0).

Coa iteración sobre o índice modificamos directamente a lista, sen facer unha copia. É un método moi eficar e convén coñecelo.

Podes ver a saída e comparala co caso anterior, a iteración por elementos:

[Repl.it: lista iterando por elementos ou índices]

Exercicios:

  1. Crea unha lista de palabras, cadenas, e fai unha consulta por elementos e por índices. Por exemplo, os teus ofídios preferidos.
  2. Fai o mesmo gardando os elementos nunha lista nova que xa tiña 2 elementos anteriormente.

Listas por comprensión

Aínda que pareza mentira existe un método todavía máis compacto de facer o anterior (poderíamos decir máis "pythónico", como sinónimo de elegancia + lexibilidade en Python).

Tiñamos a lista:

numeros = [1,2,3,4,5]

e desexamos ter unha lista co doble dos números.

Podemos probar isto, unha lista por comprensión (ollo á sintaxe):

novos_numeros = [numero*2 for numero in numeros]

ou se desexamos modificar a lista orixinal simplemente escribimos o seu nome ao principio. Máis compacto non se pode! ;-)

Imos comeentar a técnica probando con outro exemplo (que será moi habitual en traballo con base de datos): temos unha lista en minúsculas e desexamos que todas as palabras comencen por maiúscula.

nomes_serpes = ['víbora', 'cobra', 'boa', 'pitón']

Percorremos a lista con un bucle for, usando un elemento (neste caso imos usar serpe, pero pode ser calquera palabra):

for serpe in nomes_serpes

Agora á esquerda poñemos a condición ou operación (neste caso podemos utilizar o método capitalice(), que convirte en maiúscula a primeira letra dun elemento:

serpe.capitalice() for serpe in nomes_serpes #é fundamental fixarse na sintaxe

Por útimo engadimos os corchetes e o nome da lista, que neste caso será o mesmo:

nomes_serpes = [serpe.capitalice() for serpe in nomes_serpes]

Convén repasar con outras listas, polo que imos ver o código e despois de executalo vas modificalo co seguinte (o único que necesitas son os métodos indicados no enunciado):

Exercicio:

  1. Crea unha lista de palabras que queremos modificar por compresión. A primeira letra en maiúscula.
  2. Crea unha consulta que devolva os elementos da lista en tres novas listas que sexan:
  • todas maiúsculas (usar método uppper()).
  • todas minúsculas (método lower()).
  • o que está en maiúscula en minúscula, e viceversa (método swapcase()).

[Repl.it: listas por comprensión]