jueves, 2 de junio de 2016

Python VII (listas o arrays)

Este es otro post dedicado a programación en Python, encontraréis todos los posts de este tipo juntos en el apartado Programación del blog. Y si queréis aprender más podéis visitar la web oficial de www.python.org

Hoy vamos a ver las listas. Las listas nos sirven para almacenar datos de forma "estructurada" en una variable. De esta forma conseguimos que una variable pueda almacenar múltiples valores en lugar de un solo valor, para los que ya sabéis algo de programación las listas son similares a lo que en otros lenguajes llamamos matrices.




1. Definir una lista


Para crear una lista usaremos variable=[..] dentro de los corchetes incluiremos los valores que queremos almacenar separados por coma. Veamos un ejemplo

# definimos una lista de valores y los asignamos a la variable lista_1
lista_1=[18,'Alex','2016',True,3.1416]
# mostramos los valores de la lista
print(lista_1)

como podéis ver he creado una lista en una variable llamada lista_1, que contiene un total de 5 datos. Como veis los datos pueden ser de diferente tipo, números, texto, lógicos... y al contrario que en otros lenguajes no es necesario definir ni el tipo ni el tamaño de la lista.



2. Acceder a los elementos de una lista



Una vez he definido una lista lo más probable es que tenga que acceder a sus valores, para ello usaremos el índice o posición del elemento de la lista (el primer elemento de la lista tiene el índice 0). mirad el siguiente ejemplo

# definimos una lista de valores y los asignamos a la variable lista_1
lista_1=[18,'Alex','2016',True,3.1416]
# accedemos al segundo elemento de la lista y lo mostramos por pantalla
print(lista_1[1])
# accedemos al quinto elemento de la lista y lo mostramos por pantalla
print(lista_1[4])
# accedemos al pimer elemento de la lista y lo mostramos por pantalla
print(lista_1[0])


3. Modificar el valor de un índice de la lista


Para poder modificar el valor de un índice de la lista sencillamente usaremos su índice y le asignaremos un nuevo valor como os muestro a continuación

# definimos una lista de valores y los asignamos a la variable lista_1


lista_1=[18,'Alex','2016',True,3.1416]

# mostramos el cuarto elemento de la lista (indice 3)

print(lista_1[3])

# modificamos el valor del cuarto elemento (indice 3)

lista_1[3]=False 

# mostramos el cuarto elemento de la lista (indice 3)


print(lista_1[3])



si por error intentamos mostrar o cambiar un índice que no existe el programa nos devolverá un error del tipo Index out of range. Lo podéis comprobar con este código

# definimos una lista de valores y los asignamos a la variable lista_1
lista_1=[18,'Alex','2016',True,3.1416]
# accedemos al septimo elemento de la lista y lo mostramos por pantalla
print(lista_1[6])
# Tenemos que recibir un error Index out of range


4. Conocer la longitud de una lista



Ya sabemos como averiguar la longitud de una cadena, en este caso usaremos la misma orden len() para saber el número de valores que contiene una lista, mirad el ejemplo

# definimos una lista de valores y los asignamos a la variable lista_1
lista_1=[18,'Alex','2016',True,3.1416]
# mostramos por pantalla el número de valores de nuestra lista
print(len(lista_1))


5. Añadir elementos a la lista



Podemos añadir elementos a una lista de tres formas diferentes, con las instrucciones append, insert y extend.


5.1 Añadir elementos al final de una lista (append)



Con esta orden podemos añadir valores al final de nuestra lista, como en el siguiente ejemplo

# definimos una lista de valores y los asignamos a la variable lista_1
lista_1=[18,'Alex','2016',True,3.1416]
# añadimos un nevo valor al final de la lista
lista_1.append("Trash")
# accedemos al último elemento de la lista añadido y lo mostramos por pantalla
print(lista_1[5])

con la instrucción append no es necesario especificar la posición, sencillamente se añade siempre al final de nuestra lista


5.2 Añadir elementos en una posición determinada de la lista (insert)



Con esta orden añadimos un elemento en un posición determinada de nuestra lista (para ello necesitaremos indicar la posición y el valor), tened en cuenta que los elementos situados después del elemento añadido se desplazarán una posición, veamos un ejemplo

# definimos una lista de valores y los asignamos a la variable lista_1
lista_1=[18,'Alex','2016',True,3.1416]
# añadimos un nuevo valor en la posición 3
lista_1.insert(3,"Bin")
# accedemos al nuevo valor añadido en la posición 3 y lo mostramos por pantalla
print(lista_1[3])
# accedemos al valor desplazado en la posición 4 y lo mostramos por pantalla
print(lista_1[4])
# accedemos al valor desplazado en la posición 5 y lo mostramos por pantalla
print(lista_1[5])


5.3 Añadir los elementos de una lista a otra lista (extend)



Con esta orden podemos añadir los elementos de una lista al fina de los elementos de otra lista, veamos un ejemplo

# definimos una lista de valores y los asignamos a la variable lista_1
lista_1=[18,'Alex']
# definimos otra lista de valores y los asignamos a la variable lista_2
lista_2=[True,3.1416]
# al final de la lista_1 le añadimos los valores de la lista_2
lista_1.extend(lista_2)
# accedemos al los diferentes valores de lista_1 y los mostramos por pantalla
print(lista_1[0])
print(lista_1[1])
print(lista_1[2])
print(lista_1[3])


6. Eliminar elementos de una lista (pop)



También podemos eliminar los elementos de una lista con la orden pop, mirad este ejemplo

# definimos una lista de valores y los asignamos a la variable lista_1
lista_1=[18,'Alex','2016',True,3.1416]
# eliminamos el elemento de la posición 1 
lista_1.pop(1)
# mostramos por pantalla los elementos de la lista
print(lista_1)

también podemos usar la orden pop sin indicarle la posición, en este caso siempre eliminará el último elemento de la lista

# definimos una lista de valores y los asignamos a la variable lista_1


lista_1=[18,'Alex','2016',True,3.1416]

# eliminamos el elemento de la última posición

lista_1.pop()
# mostramos por pantalla los elementos de la lista
print(lista_1)

7. Crear una lista a partir de una cadena (split)


Es muy común querer convertir una cadena en una lista de valores, para ello usamos la orden split, tal y como se muestra en el siguiente ejemplo.

# definimos una lista que asignamos a una variable
cadena="uno dos tres cuatro cinco"
# transformamos la cadena en una lista y la asignamos a la variable lista_1
lista_1=cadena.split()
# accedemos a los diferentes valores de la lista y los mostramos por pantalla
print(lista_1[0])
print(lista_1[1])
print(lista_1[2])
print(lista_1[3])
print(lista_1[4])

También podemos añadir a split un parámetro para indicar-le el separador que debe utilizar para separar los diferentes valores, como podéis ver en este ejemplo

# definimos una lista que asignamos a una variable
cadena="1;2;3;4;5"
# transformamos la cadena en una lista indicando un separados y la asignamos a la variable lista_1
lista_1=cadena.split(';')
# accedemos a los diferentes valores de la lista y los mostramos por pantalla
print(lista_1[0])
print(lista_1[1])
print(lista_1[2])
print(lista_1[3])
print(lista_1[4])


8. Recorrer los elementos de una lista



Para recorrer una lista y aplicar funciones o instrucciones nos podemos valer de las instrucciones de bucle for que ya vimos en el apartado de sintaxis, pero aplicándolo a nuestra lista con la instrucción in, veamos un ejemplo

# definimos una lista que asignamos a una variable
lista_1=[18,'Alex','2016',True,3.1416]
# recorremos la lista con un bucle for y mostramos por pantalla los elementos
for x in lista_1:
    print(x)

se mostrará pos pantalla cada uno de los elementos de la lista


9. Enumerar los elementos de una lista



También podemos recorrer una lista y a la vez enumerar los elementos que la componen, para ello nos valdremos de un bucle for que ya vimos en el apartado sintaxis, aplicándolo a una lista con la instrucción enumerate, como en este ejemplo

# definimos una lista que asignamos a una variable
lista_1=[18,'Alex','2016',True,3.1416]
# recorremos la lista con un bucle for y mostramos por pantalla los elementos y la posición
for (i,x) in enumerate(lista_1):
    print(i,x)

en este caso veremos por pantalla la posición y el valor de los elementos de la lista

Para acabar tened en cuenta que podemos usar una instrucción for simple para realizar las mismas tareas que en los dos ejemplos anteriores, solo tenemos que saber la longitud total de la lista que ya hemos visto que se obtiene con la instrucción len(), como en este ejemplo

# definimos una lista que asignamos a una variable
lista_1=[18,'Alex','2016',True,3.1416]
# recorremos la lista con un bucle for y mostramos por pantalla posición y valor de los elementos
for (i) in range (len(lista_1)):
    print(i,lista_1[i])

como podéis ver por pantalla obtenemos el mismo resultado que el ejercicio anterior



10. Ordenar una lista



Para ordenar una lista usaremos la instrucción sort. Tened en cuenta que al aplicar esta instrucción se altera el orden de la lista. Aquí vemos como hacerlo

# definimos una lista que asignamos a una variable
lista_1=['coche','manzana','zanahoria','rueda','nieve']
# ordenamos la lista
lista_1.sort()
# recorremos la lista y mostramos los elementos ordenados y la posición
for (i,x) in enumerate(lista_1):
    print(i,x)

veremos por pantalla los elementos ordenados de la lista
si deseamos conservar el orden original de nuestra lista, antes de aplicar la instrucción sort debemos hacer una copia de nuestra lista original con la orden copy, aquí tenéis otro ejercicio

# importamos la libreria copy para poder usar el comando
import copy
# definimos una lista que asignamos a una variable
lista_1=['coche','manzana','zanahoria','rueda','nieve']
# copiamos la lista
lista_2=copy.copy(lista_1)
# ordenamos la nueva lista creada
lista_2.sort()
# recorremos la lista ordenada y mostramos por pantalla los elementos y la posición
print('Lista ordenada:')
for (i,x) in enumerate(lista_2):
    print(i,x)
# recorremos la lista original y mostramos por pantalla los elementos y la posición
print('Lista original:')
for (i,x) in enumerate(lista_1):
    print(i,x)


11. Recortar una lista



Podemos truncar una lista a partir de la posición los elementos de la misma, para ello usaremos la instrucción [x:y], donde x es la posición del primer elemento y y la posición del último elemento (pero tened en cuenta que la segunda posición es exclusiva, o sea no se incluirá), veamos un ejemplo

# importamos la libreria copy
import copy #definimos una lista que asignamos a una variable
lista_1=['coche','manzana','zanahoria','rueda','nieve']
# asignamos a una variable nueva la lista truncada
lista_2=lista_1[1:3]
# recorremos la lista truncada y mostramos por pantalla los elementos y la posición
for (i,x) in enumerate(lista_2):
    print(i,x)

veremos por pantalla los valores de los elementos que forman la lista truncada, recordad que la primera posición tiene el índice 0.

Podemos omitir las variables en este caso si omitimos el primer valor por defecto obtendremos una sublista donde el primer elemento es el 0, y en el caso de omitir el segundo valor obtendremos una lista hasta el último elemento, mirad los dos ejemplos siguientes

# definimos una lista que asignamos a una variable
lista_1=['coche','manzana','zanahoria','rueda','nieve']
# mostramos por pantalla la lista truncada omitiendo el primer valor
print(lista_1[:3])

la lista truncada empieza en el primer elemento hasta el que ocupa la posición 3 (tened en cuenta que el segundo valor es exclusivo y no se incluye)

# definimos una lista que asignamos a una variable
lista_1=['coche','manzana','zanahoria','rueda','nieve']
# mostramos por pantalla la lista truncada omitiendo el primer valor
print(lista_1[1:])

en este caso la lista truncada va del elemento en la posición 1 hasta el último

Otra posibilidad es utilizar números negativos para obtener por ejemplo los últimos elementos de una lista, como en estos dos ejemplos

# definimos una lista que asignamos a una variable

lista_1=['coche','manzana','zanahoria','rueda','nieve']

# mostramos por pantalla la lista truncada

print(lista_1[-3:])



veremos por pantalla los tres últimos elementos de la lista original



# definimos una lista que asignamos a una variable

lista_1=['coche','manzana','zanahoria','rueda','nieve']

# mostramos por pantalla la lista truncada

print(lista_1[:-3])

veremos por pantalla los dos primeros elementos (como el segundo indice es exclusivo solo aparecen dos elementos) de la lista original


12. Funciones y listas



Python nos permite aplicar funciones sobre los elementos de una lista sin necesidad de crear una instrucción con líneas sangradas dentro de un bucle, lo mejor es ver un ejemplo

# definimos una lista que asignamos a una variable
lista_1=['coche','manzana','zanahoria','rueda','nieve']
# aplicamos una instrucción a todos los elementos de una lista
print([x.upper() for x in lista_1])

por pantalla vemos que todos los elemento de la lista en mayúsculas (esta función no altera la lista original que se mantiene tal y como se ha definido)

tenemos que poner toda la expresión entre corchetes [ ], dentro en primer lugar ponemos el código que se aplicará a cada uno de los elementos de la lista x.upper() y en segundo lugar una instrucción for x in lsita_1 sin lineas sangradas, de esta forma nos ahorramos crear una instrucción for con lineas sangradas


Os animo a modificar y cambiar el código para ver como se comporta, hasta pronto.