Skip to content
11/04/2013 / X3MBoy

Python – Post 02

Volvemos con Python luego de un muy largo rato. Lo siento, y no voy a darles excusas, solo decirles que retomaré esto con un mejor hilo, mayor frecuencia y mejor contenido.

Volviendo, en esta ocasión vamos a hablar de las estructuras de datos conocidas como “colecciones”.

¿Que es una colección?

Una colección es una agrupación de datos, simples o complejos, que guardan una relación entre sí (o deberían). La forma más común de una colección que se utiliza en los lenguajes de programación son los arreglos. Un arreglo es una colección de variables de un mismo tipo que se guardan en una secuencia consecutiva de memoria, y se acceden a través de un mismo nombre. ¿Cómo se come eso? Bueno simple, veamos un ejemplo en Java:

int [] arreglo;
arreglo = new int[10];

Así, estamos definiendo un arreglo de 10 enteros. Pero ¿Cómo se accede a un valor específico? pues simple:

arreglo[0] = 10;

Pero con Python hay un pequeño detalle, que al final es bueno para nosotros: “Los arreglos no existen en Python“, o por lo menos no en la forma tradicional de usarlos en otros lenguajes de programación(1).

En Python tenemos 3 tipos de colecciones: listas, diccionarios y tuplas. Empecemos con las listas.

Listas

Las listas son lo más parecido a un arreglo que conseguián en Python. Consiste de una colección ordenada de datos de cualquier tipo, incluso otras listas. El concepto puede ser algo abstracto, así que veamos un ejemplo gráfico:

Como pueden observar en la imagen, una lista puede enlazar distintos tipos de datos en una sola estructura, cosa que no se puede hacer en lenguajes como Java ó C++. Como comenté un poco más arriba, tambien puedes tener una lista en otra lista, pudiendo hacer los conocidos “arreglos bidimensionales” con una lista que sólo contiene listas.

El operador para trabajar con listas es “[ ]” (corchete), así para crear una lista se hace de la siguiente manera:

lista = [1, 2, 3]

Quedando inicializada la lista con 3 elementos. Para acceder a un elemento de la lista se hace referencia al nombre de la variable, seguida de la posición a la que se desa acceder entre corechetes:

numero = lista[0]

Ahora la variable numero tiene el valor 1 (la posición 0 de la lista).También hay que recordar que en la mayoría de los lenguajes de programación, el primer elemento de una estructura secuencial está en la posición “0” (cero), o dicho en lenguaje C/C++ o Java: “La primera posición de un arreglo es la posición cero”. Pero acceder a cada elemento de la lista usando el operador “corchete” no es muy funcional. Normalmente se va a querer acceder a todos los elementos de la lista, uno por uno. Para eso utilizaremos el iterador de listas, el “for“, de la siguiente forma:

for numero in lista:
     print numero

Con esto, la variable número obtendrá cada uno de los valores de la lista en cada iteración o “vuelta del ciclo” y serán impresos en pantalla uno por uno. Estas serían operaciones de lectura.

Para la escritura podemos hacer varias cosas. La primera es trabajarlo estilo Java o estilo C++, de la siguiente manera:

for i in range(10):
    lista[i] = i

Como observan, esto guardará los números del 0 al 9 en la lista. Pero puede suceder que no queremos guardar un número específico de valores, es decir, nuestro arreglo aún no tiene una “dimensión” ó “tamaño“. Para estos casos, vamos a recurrir a las funciones propias de la lista.

En este punto debo decir que las listas en Python son objetos, por lo que tienen métodos asociados a ellas. Los objetos serán tratados en otro post más adelante.

Así por ejemplo podemos hacer lo siguiente:

while True:
    i = raw_input("Indique un nombre o presione enter para finalizar:\n")
    if i!='':
        lista.append(i)
    else:
        break

Luego de esto tendríamos una lista con los nombres que fueron ingresados por el teclado. No es algo muy elegante, pero por ahora funciona.

La forma más normal de ver el contenido de una lista es como se indicó en los métodos de lectura, pero el método o función “print” puede mostrar tambien el contenido completo de una lista:

print lista
['Eduard', 'Alexander', 'José', 'Carmen']

Como ven, imprime la lista tal cual se almacena en memoria, incluyendo las comillas simples que indica que son cadenas de caracteres y los corchetes que indican el inicio y el fin de la lista.

Una curiosidad, aunque es más bien una funcionalidad, es la posibilidad de utilizar números negativos como índice de la lista, así:

nombre = lista[-2]

Nos guardaría en “nombre” el valor de la penúltima posición de la lista. Lo que significa que el índice negativo significa que se recorre el arreglo de atrás hacia adelante. Quiero acotar que al valor que se coloca entre corchetes, indicando una posición del arreglo, se le conoce como “índice“, así lo llamaré de ahora en adelante.

Otra funcionalidad importante en las listas son las particiones o sublistas (en inglés el contenido lo hallarán como “slicing” que es el proceso de obterner una partición, es decir proceso de particionado). Esto es una característica bien avanzada, que nos permite crear una lista derivada de otra lista a través del operador “:”. Mejor hacemos un ejemplo para que vean la utlización:

sublista = lista[0:2]

Con esto tenemos que “sublista” será una lista que contiene los dos primeros elementos de “lista“. ¿Por qué? Pues simple, por los índices. Con el operador “:” separamos dos índices: el primero nos indica desde que posición se tomaran elementos de la lista; el segundo indica cuantas posiciones tomar desde el índice de arranque. Es decir, ese código significa que “sublista es igual a dos posiciones de lista, comenzando en la posición cero“. Se podría decir que es un resumen del código:

for a in range(2):
     sublista[a] = lista[a]

Además con un segundo operador “:” puedes indicar cada cuantas posiciones tomar un elemento de la lista, por ejemplo: si queremos tener una posición sí y una no (posiciones intercaladas) de la lista podemos hacer lo siguiente:

sublista = lista[0:3:2]

Entonces en sublista tendríamos los valores 1 y 3, dado que hemos indicado un salto de 2 posiciones. Esto es especialmente útil para listas ordenadas en funciones matemáticas como por ejemplo números pares e impares.
Adicionalmente, para hacer slicing también son válidos los índices negativos, los cuales tendrán el mismo comportamiento que se describió al principio. También es importante indicar que no se tienen que dar valores a cada parte de un particionado, es decir no se tienen que indicar los índices:

sublista = lista[-2:]

Esto me tomará los dos últimos valores de la lista, ó:

sublista = lista[1:]

Esto tomará todos los valores de lista, excepto el primero. Esto siginifica básicamente que cada parámetro de un “slicing”, es decir cada índice utilizado tiene un valor “default”, que en el caso del primer índice es 0, en el caso del segundo es la longitud de la lista y el tercero es “1” (y que cuando se hace slicing, siempre el 3er parámetro, el salto, es tomado aunque no se indíque explícitamente, sólo que en principio es tomado por default).

Actualización

Casi lo olvido. Tal como les comenté más arriba, una lista puede contener otra lista, y con ella hacer una especie de arreglo bidimensional (aunque no exactamente igual), y la forma de acceder a los elementos sería usando dos veces el “[]” (Corchete).

lista = [['a','b','c'],['d','e','f'],['g','h','i']]
sublista = lista[0]
elemento = lista[0][0]

Así sublista tendíra la lista [‘a’,’b’,’c’] y elemento tendría “a”

Para la próxima edición estaremos revisando lo que son las Tuplas y los Diccionarios.

Saludos,

Be Free, Be Linux…

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: