List en Python, con ejemplos
El proyecto de este post lo puedes descargar pulsando AQUI.
Las listas (o ‘List’) en Python son un tipo de estructuras de datos muy flexible que guardan de forma ordenada un conjunto de datos que no tiene porque ser del mismo tipo. En otros lenguajes de programación una lista equivaldría a un array, aunque Python no exige que los elementos de la lista tenga que ser del mismo tipo (‘int’, ‘float’, ‘chr’, ‘str’, ‘bool’, ‘object’).
Veamos a continuación un ejemplo de una lista en Python:
# Declaramos una lista con diferente tipos de datos lista = [1, 3.1416, 'j', 'jarroba.com', True]
Como vemos la lista la declaramos entre los caracteres '[ ]' y los elementos que hay en esta lista son de diferente tipo. Vamos a continuación a recorrer la lista (con un foreach) y a imprimir los elementos de la misma con el tipo de datos que es cada uno de los elementos:
print 'Imprimimos los elementos de una lista y el tipo de dato de cada elemento' for l in lista: print '%s - %s' %(l, type(l))
Como resultado de este código tenemos lo siguiente:
Imprimimos los elementos de una lista, con su tipo de dato y el contenido 1 - <type 'int'> 3.1416 - <type 'float'> j - <type 'str'> jarroba.com - <type 'str'> True - <type 'bool'>
Como vemos, las listas en Python permiten trabajar con elementos de diferentes tipos de datos, tal y como hemos demostrado.
Vamos a pasar ahora a mostrar los métodos (o funciones) para trabajar con las listas en Python, y posteriormente a poner ejemplos del funcionamiento de estos métodos:
# Declaración de una lista lista = list() # Cuenta el número de elementos de la lista len(lista) # Agrega un elemento (x) al final de la lista. lista.append(x) # Inserta un elemento (x) en una posición determinada (pos) lista.insert(pos, x) # Une dos listas (une la lista2 (la que se pasa como parámetro) a la lista) lista.extend(lista2) # Borra el primer elemento de la lista cuyo valor sea x. Sino existe devuelve un error lista.remove(x) # Borra el elemento en la posición dada de la lista, y lo devuelve. lista.pop(pos) # Borra todos los elementos de la lista (lista.clear()) del lista[:] # Devuelve el índice en la lista del primer elemento cuyo valor sea x. lista.index(x) # Devuelve el número de veces que x aparece en la lista. lista.count(x) # Ordena los ítems de la lista lista.sort(cmp=None, key=None, reverse=False) # Invierte los elementos de la lista. lista.reverse() # Devuelve una copia de la lista (lista.copy()) listaCopia = lista[:]
Una vez vistos los métodos (o funciones) que nos permiten trabajar con las listas, vamos a mostrar como trabajar con estos métodos. Para ello nos vamos a crear una lista en la que guardaremos las demarcaciones en la que pueden jugar los futbolistas en un partido de fútbol; es decir, que guardaremos elementos de tipo string.
Lo primero que hacemos es crearnos una variable de tipo lista (definimos esta variable de forma explicita) que llamaremos 'demarcaciones' y añadiremos los elementos con el método "append(x)":
# Ejemplo de lista en la que guardaremos las demarcaciones en el fútbol demarcaciones = list() # Insertamos algunas demarcaciones demarcaciones.append('Defensa') demarcaciones.append('Lateral') demarcaciones.append('MedioCentro') demarcaciones.append('Centro Campista') demarcaciones.append('Extremo') print demarcaciones
Si ejecutamos este fragmento de código, en el que insertamos elementos a la lista y la imprimimos, tenemos lo siguiente:
['Defensa', 'Lateral', 'MedioCentro', 'Centro Campista', 'Extremo']
Una vez que tenemos elementos en nuestra lista, podemos contar los elementos de la siguiente forma:
# Vemos cuantos elementos tiene nuestra lista numElem = len(demarcaciones) print 'Número de elementos en la lista: %d' %numElem
Como salida tenemos lo siguiente:
Número de elementos en la lista: 5
La función "len()" no es especifica para contar el número de elementos de la lista, sino que vale para contar el número de caracteres de un string, el número de elementos de un diccionario, etc. aunque lo mostramos en este tutorial para que sepais que el número de elementos de una lista se cuenta con esta función.
Pasamos a probar el método "insert(pos,x)" en el que inserta un elemento 'x' en la posición 'pos' de la lista que le indicamos. Veamos un ejemplo:
# Insertamos elementos en posiciones determinadas demarcaciones.insert(0, 'Portero') demarcaciones.insert(6, 'Delantero') print demarcaciones
Como vemos, insertamos los elementos 'Portero' y 'Delantero' en las posiciones 0 y 6 respectivamente en la lista. RECORDAR: que las listas (como pasa en otros lenguajes de programación) empiezan enumerandose por la posición '0'. Si ejecutamos el fragmento de código anterior, veremos que efectivamente insertamos en la primera y última posición los elementos 'Portero' y 'Delantero'.
['Portero', 'Defensa', 'Lateral', 'MedioCentro', 'Centro Campista', 'Extremo', 'Delantero']
El siguiente método "extend(list)" une los elementos de la lista que se le pasa como parámetro a la lista. Vemos en el siguiente fragmento de código como nos creamos una lista (llamada 'lista2') que uniremos o concatenaremos a la lista demarcaciones de la siguiente manera:
# Concatenamos dos listas lista2 = ['Arquero', 'Carrilero', 'Portero', 'Lateral'] demarcaciones.extend(lista2) print demarcaciones
Como resultado de unir estas dos listas tenemos lo siguiente (demarcaciones + lista2):
['Portero', 'Defensa', 'Lateral', 'MedioCentro', 'Centro Campista', 'Extremo', 'Delantero', 'Arquero', 'Carrilero', 'Portero', 'Lateral']
El siguiente método que vamos a proba va a ser "remove(x)" que eliminará el primer elemento 'x' que se encuentre en la lista. En el ejemplo que vemos a continuación borraremos el primer elemento que sea 'Lateral':
# Borramos la primera aparición del elemento 'Lateral' de la lista demarcaciones.remove('Lateral') print demarcaciones
Como resultado tenemos el siguiente contenido, que como vemos ha eliminado la primera aparición de 'Lateral' (que se encontraba en tercer lugar), pero no ha eliminado la segunda aparición de 'Lateral' que se encuentra en la última posición:
['Portero', 'Defensa', 'MedioCentro', 'Centro Campista', 'Extremo', 'Delantero', 'Arquero', 'Carrilero', 'Portero', 'Lateral']
Otro método de borrado es el método "pop(pos)" que elimina el elemento que se encuentra en la posición 'pos' que se pasa como parámetro. Como vemos en el siguiente ejemplo, borraremos el elemento que se encuentra en la tercera posición (el elemento 'MedioCentro'). Dado que las listas empiezan a enumerarse por '0' para borrar el tercer elemento, debemos de pasarle como parámetro un '2':
# Borramos en tercer elemento de la lista PD: las lista empiezan en el elemento 0 demarcaciones.pop(2) print demarcaciones
Como resultado tenemos que nos ha eliminado la tercera posición; es decir, a borrado 'MedioCentro'
['Portero', 'Defensa', 'Centro Campista', 'Extremo', 'Delantero', 'Arquero', 'Carrilero', 'Portero', 'Lateral']
El siguiente método que vamos a ver es el método "index(x)" que nos devolverá la posición del primer elemento 'x' de la lista. Si buscamos el valor 'Extremo' en la lista nos devolverá como resultado '3' (que corresponde a la cuarta posición):
# Buscamos la posición del primer elemento con valor = 'Extremo' print demarcaciones.index('Extremo')
El método "count(x)" nos va a devolver el número de veces que esta el elemento 'x' en la lista. A continuación vemos un ejemplo en el que vamos a contar el numero de veces que aparecen los elementos 'Portero' y 'Delantero' respectivamente:
# Vemos el número de veces que esta en la lista el elemento 'Portero' y 'Delantero' print demarcaciones.count('Portero') print demarcaciones.count('Delantero')
Como resultado tenemos que el elemento 'Portero' esta 2 veces y el elemento 'Delantero' esta solo una vez:
2 1
Para invertir la lista tenemos el método "reverse()". Veamos un ejemplo de como invertiríamos la lista:
# Invertimos los elementos de las lista demarcaciones.reverse() print demarcaciones
Como resultado tenemos la lista invertida:
['Lateral', 'Portero', 'Carrilero', 'Arquero', 'Delantero', 'Extremo', 'Centro Campista', 'Defensa', 'Portero']
Para hacer una copia de una lista, se puede hacer utilizando el método "copy" aunque para ello deberiamos hacer previamente un "import copy". Para hacerlo mucho más sencillo y para no tener que importarnos ninguna libreria extra, las copias de una lista las haremos de la siguiente manera:
# Hacemos una copia de la lista demarcaciones copiaDemarcaciones = demarcaciones[:] print 'Copia %s' %copiaDemarcaciones
Lo que estamos haciendo es copiar en la variable 'copiaDemarcaciones' el contenido de toda la lista ( [ : ] ) 'demarcaciones'. En esta caso y a diferencia de otros lenguajes como Java, no estamos haciendo una referencia a una lista, sino que estamos haciendo una copia de la lista; es decir que si manipulamos la lista 'copiaDemarcaciones' (borrado, insert, reverse, …) esta no afectará a la lista 'demarcaciones' ya que son copias en memoria y no referencias. Como resultado del fragmento de código anterior (la copia) tenemos lo siguiente:
Copia ['Lateral', 'Portero', 'Carrilero', 'Arquero', 'Delantero', 'Extremo', 'Centro Campista', 'Defensa', 'Portero']
Para borrar todos los elementos de una lista se puede utilizar el método "remove()" aunque es mejor hacer un borrado de la lista de la siguiente forma:
# Borramos todos los elementos de la lista 'copiaDemarcaciones' del copiaDemarcaciones[:] print copiaDemarcaciones
En este caso vamos a borrar el contenido de la lista 'copiaDemarcaciones' y vemos que como resultado tenemos una lista sin elementos:
[]
Por último vamos a ver uno de los métodos más interesantes de las lista, que es el método de ordenación "sort()". Abtrayéndonos del algoritmos que utiliza para hacer la ordenación de la lista (quicksort, inserción directa, método de la burbuja, etc.), el método "sort()" permite ordenar la lista en orden (alfabético, numérico, etc.) tanto en un sentido como en otro.
Vamos a pasar a poner un ejemplo y a ordenar alfabeticamente la lista. Para ello hacemos lo siguiente:
# Ordenamos la lista demarcaciones por orden alfabético demarcaciones.sort() print demarcaciones
Como resultado tenemos la lista ordenada en orden alfabetico:
['Arquero', 'Carrilero', 'Centro Campista', 'Defensa', 'Delantero', 'Extremo', 'Lateral', 'Portero', 'Portero']
EL método "sort()" permite pasarle una serie de parámetros para la ordenación, ya que si en la lista tuviesemos objetos en vez de datos atómicos, esta la ordenase por algún atributos del objeto. En este tutorial no vamos a entrar en ese detalle y solo vamos a ver como ordenar la lista en sentido inverso pasándole el parámetro 'reverse = True|False'. Veamos el ejemplo:
demarcaciones.sort(reverse=True) print demarcaciones
Vemos que como resultado tenemos la lista ordenada en orden alfabético pero en sentido inverso:
['Portero', 'Portero', 'Lateral', 'Extremo', 'Delantero', 'Defensa', 'Centro Campista', 'Carrilero', 'Arquero']
Veamos otro ejemplo de ordenación de listas, pero en este caso con números en vez de con palabras. En el siguiente fragmento de código vamos a ver como se ordenaría la 'listaNumero' tanto de forma ascendente como descendente:
print '\n\n******* Ordenación de listas ******' listaNumero = [5,2,9,1,12,6,8,3,4] print 'Lista Desordenada' print listaNumero print 'Lista ordenada de forma ascendente (Aqui da igual pasarle "reverse=False" como parámetro)' listaNumero.sort(reverse=False) print listaNumero print 'Lista ordenada de forma descendente' listaNumero.sort(reverse=True) print listaNumero
Como resultado tenemos lo siguiente:
******* Ordenación de listas ****** Lista Desordenada [5, 2, 9, 1, 12, 6, 8, 3, 4] Lista ordenada de forma ascendente (Aqui da igual pasarle "reverse=False" como parámetro) [1, 2, 3, 4, 5, 6, 8, 9, 12] Lista ordenada de forma descendente [12, 9, 8, 6, 5, 4, 3, 2, 1]
Para saber más sobre la ordenación de listas en Python, ver el siguiente tutorial: "Ordenar listas en Python, con ejemplos"