Beruflich Dokumente
Kultur Dokumente
5. Estructuras de datos
Este captulo describe algunas cosas que ya aprendiste en ms detalle, y agrega algunas cosas nuevas tambin.
a [ l e n ( a ) : ]=[ x ] .
a [ l e n ( a ) : ]=L .
Inserta un tem en una posicin dada. El primer argumento es el ndice del tem delante del cual se insertar, por lo tanto a . i n s e r t ( 0 , x ) inserta al principio de la lista, y a . i n s e r t ( l e n ( a ) ,x )equivale a a . a p p e n d ( x ) .
l i s t . r e m o v e (x)
Quita el primer tem de la lista cuyo valor sea x. Es un error si no existe tal tem.
l i s t . p o p (
[i ])
Quita el tem en la posicin dada de la lista, y lo devuelve. Si no se especifica un ndice, a . p o p ( ) quita y devuelve el ltimo tem de la lista. (Los corchetes que encierran a i en la firma del mtodo denotan que el parmetro es opcional, no que deberas escribir corchetes en esa posicin. Vers esta notacin con frecuencia en la Referencia de la Biblioteca de Python.)
l i s t . i n d e x (x)
Devuelve el ndice en la lista del primer tem cuyo valor sea x. Es un error si no existe tal tem.
l i s t . c o u n t (x)
6/4/2014
Invierte los elementos de la lista, in situ. Un ejemplo que usa la mayora de los mtodos de lista:
> > >a=[ 6 6 . 2 5 ,3 3 3 ,3 3 3 ,1 ,1 2 3 4 . 5 ] > > >p r i n ta . c o u n t ( 3 3 3 ) ,a . c o u n t ( 6 6 . 2 5 ) ,a . c o u n t ( ' x ' ) 210 > > >a . i n s e r t ( 2 ,1 ) > > >a . a p p e n d ( 3 3 3 ) > > >a [ 6 6 . 2 5 ,3 3 3 ,1 ,3 3 3 ,1 ,1 2 3 4 . 5 ,3 3 3 ] > > >a . i n d e x ( 3 3 3 ) 1 > > >a . r e m o v e ( 3 3 3 ) > > >a [ 6 6 . 2 5 ,1 ,3 3 3 ,1 ,1 2 3 4 . 5 ,3 3 3 ] > > >a . r e v e r s e ( ) > > >a [ 3 3 3 ,1 2 3 4 . 5 ,1 ,3 3 3 ,1 ,6 6 . 2 5 ] > > >a . s o r t ( ) > > >a [ 1 ,1 ,6 6 . 2 5 ,3 3 3 ,3 3 3 ,1 2 3 4 . 5 ]
6/4/2014
desplazados por uno). Para implementar una cola, us c o l l e c t i o n s . d e q u e el cual fue diseado para agregar y sacar de ambas puntas de forma rpida. Por ejemplo:
> > >f r o mc o l l e c t i o n si m p o r td e q u e > > >q u e u e=d e q u e ( [ " E r i c " ," J o h n " ," M i c h a e l " ] ) > > >q u e u e . a p p e n d ( " T e r r y " ) #l l e g aT e r r y > > >q u e u e . a p p e n d ( " G r a h a m " ) #l l e g aG r a h a m > > >q u e u e . p o p l e f t ( ) #e lp r i m e r oe nl l e g a ra h o r as ev a ' E r i c ' > > >q u e u e . p o p l e f t ( ) #e ls e g u n d oe nl l e g a ra h o r as ev a ' J o h n ' > > >q u e u e #e lr e s t od el ac o l ae n r d e nd el l e g a d a [ ' M i c h a e l ' ,' T e r r y ' ,' G r a h a m ' ]
una secuencia con aquellos tems de la secuencia para los cuales f u n c i o n ( i t e m )es verdadero. Si secuencia es un s t r i n go t u p l e , el resultado ser del mismo tipo; de otra manera, siempre ser l i s t . Por ejemplo, para calcular unos nmeros primos:
> > >d e ff ( x ) :r e t u r nx%2! =0a n dx%3! =0 . . . > > >f i l t e r ( f ,r a n g e ( 2 ,2 5 ) ) [ 5 ,7 ,1 1 ,1 3 ,1 7 ,1 9 ,2 3 ]
a f u n c i o n ( i t e m ) por cada uno de los tems de la secuencia y devuelve una lista de los valores retornados. Por ejemplo, para calcular unos cubos:
> > >d e fc u b o ( x ) :r e t u r nx * x * x . . . > > >m a p ( c u b o ,r a n g e ( 1 ,1 1 ) ) [ 1 ,8 ,2 7 ,6 4 ,1 2 5 ,2 1 6 ,3 4 3 ,5 1 2 ,7 2 9 ,1 0 0 0 ]
m a p ( f u n c i o n ,s e c u e n c i a ) llama
Se puede pasar ms de una secuencia; la funcin debe entonces tener tantos argumentos como secuencias haya y es llamada con el tem correspondiente de cada secuencia (o N o n e si alguna secuencia es ms corta que otra). Por ejemplo:
> > >s e c=r a n g e ( 8 ) > > >d e fa d d ( x ,y ) :r e t u r nx + y . . . > > >m a p ( a d d ,s e c ,s e c ) [ 0 ,2 ,4 ,6 ,8 ,1 0 ,1 2 ,1 4 ]
http://docs.python.org.ar/tutorial/2/datastructures.html
3/12
6/4/2014
un nico valor que se construye llamando a la funcin binaria funcion con los primeros dos tems de la secuencia, entonces con el resultado y el siguiente tem, y as sucesivamente. Por ejemplo, para calcular la suma de los nmeros de 1 a 10:
> > >d e fs u m a r ( x , y ) :r e t u r nx + y . . . > > >r e d u c e ( s u m a r ,r a n g e ( 1 ,1 1 ) ) 5 5
r e d u c e ( f u n c i o n , s e c u e n c i a ) devuelve
Si slo hay un tem en la secuencia, se devuelve su valor; si la secuencia est vaca, se lanza una excepcin. Un tercer argumento puede pasarse para indicar el valor inicial. En este caso el valor inicial se devuelve para una secuencia vaca, y la funcin se aplica primero al valor inicial y el primer tem de la secuencia, entonces al resultado y al siguiente tem, y as sucesivamente. Por ejemplo,
> > >d e fs u m ( s e c ) : . . . d e fs u m a r ( x , y ) :r e t u r nx + y . . . r e t u r nr e d u c e ( s u m a r ,s e c ,0 ) . . . > > >s u m ( r a n g e ( 1 ,1 1 ) ) 5 5 > > >s u m ( [ ] ) 0
No uses la definicin de este ejemplo de s u m ( ) : ya que la sumatoria es una necesidad tan comn, se provee una funcin integrada s u m ( s e c u e n c i a )que funciona exactamente as. Nuevo en la versin 2.3.
6/4/2014
> > >[ 3 * xf o rxi nv e ci fx>3 ] [ 1 2 ,1 8 ] > > >[ 3 * xf o rxi nv e ci fx<2 ] [ ] > > >[ [ x , x * * 2 ]f o rxi nv e c ] [ [ 2 ,4 ] ,[ 4 ,1 6 ] ,[ 6 ,3 6 ] ] > > >[ x ,x * * 2f o rxi nv e c ] #e r r o r-s er e q u i e r e np a r n t e s i sp a r at u p l a s T r a c e b a c k( m o s tr e c e n tc a l ll a s t ) : . . . [ x ,x * * 2f o rxi nv e c ] ^ S y n t a x E r r o r :i n v a l i ds y n t a x > > >[ ( x ,x * * 2 )f o rxi nv e c ] [ ( 2 ,4 ) ,( 4 ,1 6 ) ,( 6 ,3 6 ) ] > > >v e c 1=[ 2 ,4 ,6 ] > > >v e c 2=[ 4 ,3 ,9 ] > > >[ x * yf o rxi nv e c 1f o ryi nv e c 2 ] [ 8 ,6 ,1 8 ,1 6 ,1 2 ,3 6 ,2 4 ,1 8 ,5 4 ] > > >[ x + yf o rxi nv e c 1f o ryi nv e c 2 ] [ 6 ,5 ,7 ,8 ,7 ,5 ,1 0 ,9 ,3 ] > > >[ v e c 1 [ i ] * v e c 2 [ i ]f o rii nr a n g e ( l e n ( v e c 1 ) ) ] [ 8 ,1 2 ,5 4 ]
Las listas por comprensin son mucho ms flexibles que expresiones complejas y funciones anidadas:
> > >[ s t r ( r o u n d ( 3 5 5 / 1 1 3 . 0 ,i ) )f o rii nr a n g e ( 1 , 6 ) ] [ ' 3 . 1 ' ,' 3 . 1 4 ' ,' 3 . 1 4 2 ' ,' 3 . 1 4 1 6 ' ,' 3 . 1 4 1 5 9 ' ]
m a p ( )
y pueden aplicarse a
Ahora, si quisieras intercambiar filas y columnas, podras usar una lista por comprensin:
> > >p r i n t[ [ f i l a [ i ]f o rf i l ai nm a t ]f o rii n[ 0 ,1 ,2 ] ] [ [ 1 ,4 ,7 ] ,[ 2 ,5 ,8 ] ,[ 3 ,6 ,9 ] ]
Se debe tener cuidado especial para la lista por comprensin anidada: Para evitar aprensin cuando se anidan lista por comprensin, lee de derecha a
http://docs.python.org.ar/tutorial/2/datastructures.html 5/12
6/4/2014
izquierda. Una versin ms detallada de este retazo de cdigo muestra el flujo de manera explcita:
f o rii n[ 0 ,1 ,2 ] : f o rf i l ai nm a t : p r i n tf i l a [ i ] , p r i n t
En el mundo real, deberas preferir funciones predefinidas a declaraciones con flujo complejo. La funcin z i p ( )hara un buen trabajo para este caso de uso:
> > >z i p ( * m a t ) [ ( 1 ,4 ,7 ) ,( 2 ,5 ,8 ) ,( 3 ,6 ,9 ) ]
Ver Desempaquetando una lista de argumentos para detalles en el asterisco de esta lnea.
5.2. La instruccin
d e l
Hay una manera de quitar un tem de una lista dado su ndice en lugar de su valor: la instruccin d e l . Esta es diferente del mtodo p o p ( ) , el cual devuelve un valor. La instruccin d e l tambin puede usarse para quitar secciones de una lista o vaciar la lista completa (lo que hacamos antes asignando una lista vaca a la seccin). Por ejemplo:
> > >a=[ 1 ,1 ,6 6 . 2 5 ,3 3 3 ,3 3 3 ,1 2 3 4 . 5 ] > > >d e la [ 0 ] > > >a [ 1 ,6 6 . 2 5 ,3 3 3 ,3 3 3 ,1 2 3 4 . 5 ] > > >d e la [ 2 : 4 ] > > >a [ 1 ,6 6 . 2 5 ,1 2 3 4 . 5 ] > > >d e la [ : ] > > >a [ ]
d e lpuede
Hacer referencia al nombre ade aqu en ms es un error (al menos hasta que se le asigne otro valor). Veremos otros usos para d e lms adelante.
6/4/2014
agregarse. Existe otro dato de tipo secuencia estndar: la tupla. Una tupla consiste de un nmero de valores separados por comas, por ejemplo:
> > >t=1 2 3 4 5 ,5 4 3 2 1 ,' h o l a ! ' > > >t [ 0 ] 1 2 3 4 5 > > >t ( 1 2 3 4 5 ,5 4 3 2 1 ,' h o l a ! ' ) > > >#L a st u p l a sp u e d e na n i d a r s e : . . .u=t ,( 1 ,2 ,3 ,4 ,5 ) > > >u ( ( 1 2 3 4 5 ,5 4 3 2 1 ,' h o l a ! ' ) ,( 1 ,2 ,3 ,4 ,5 ) )
Como puedes ver, en la salida las tuplas siempre se encierran entre parntesis, para que las tuplas anidadas puedan interpretarse correctamente; pueden ingresarse con o sin parntesis, aunque a menudo los parntesis son necesarios de todas formas (si la tupla es parte de una expresin ms grande). Las tuplas tienen muchos usos. Por ejemplo: pares ordenados (x, y), registros de empleados de una base de datos, etc. Las tuplas, al igual que las cadenas, son inmutables: no es posible asignar a los tems individuales de una tupla (aunque puedes simular bastante ese efecto mediante seccionado y concatenacin). Tambin es posible crear tuplas que contengan objetos mutables como listas. Un problema particular es la construccin de tuplas que contengan 0 o 1 tem: la sintaxis presenta algunas peculiaridades para estos casos. Las tuplas vacas se construyen mediante un par de parntesis vaco; una tupla con un tem se construye poniendo una coma a continuacin del valor (no alcanza con encerrar un nico valor entre parntesis). Feo, pero efectivo. Por ejemplo:
> > >v a c i a=( ) > > >s i n g l e t o n=' h o l a ' , > > >l e n ( v a c i a ) 0 > > >l e n ( s i n g l e t o n ) 1 > > >s i n g l e t o n ( ' h o l a ' , ) #< -n o t a rl ac o m aa lf i n a l
La declaracin t = 1 2 3 4 5 , 5 4 3 2 1 , ' h o l a ! ' es un ejemplo de empaquetado de tuplas: los valores 1 2 3 4 5 ,5 4 3 2 1y ' h o l a ! 'se empaquetan juntos en una tupla. La operacin inversa tambin es posible:
> > >x ,y ,z=t
Esto se llama, apropiadamente, desempaquetado de secuencias, y funciona para cualquier secuencia en el lado derecho del igual. El desempaquetado de secuencias requiere que la lista de variables a la izquierda tenga el mismo nmero de elementos que el tamao de la
http://docs.python.org.ar/tutorial/2/datastructures.html 7/12
6/4/2014
secuencia. Not que la asignacin mltiple es en realidad slo una combinacin de empaquetado de tuplas y desempaquetado de secuencias.
5.4. Conjuntos
Python tambin incluye un tipo de dato para conjuntos. Un conjunto es una coleccin no ordenada y sin elementos repetidos. Los usos bsicos de stos incluyen verificacin de pertenencia y eliminacin de entradas duplicadas. Los conjuntos tambin soportan operaciones matemticas como la unin, interseccin, diferencia, y diferencia simtrica. Una pequea demostracin:
> > >c a n a s t a=[ ' m a n z a n a ' ,' n a r a n j a ' ,' m a n z a n a ' ,' p e r a ' ,' n a r a n j a ' ,' b a n a n a ' ] > > >f r u t a=s e t ( c a n a s t a ) #c r e au nc o n j u n t os i nr e p e t i d o s > > >f r u t a s e t ( [ ' p e r a ' ,' m a n z a n a ' ,' b a n a n a ' ,' n a r a n j a ' ] ) > > >' n a r a n j a 'i nf r u t a #v e r i f i c a c i nd ep e r t e n e n c i ar p i d a T r u e > > >' y e r b a 'i nf r u t a F a l s e > > >#v e a m o sl a so p e r a c i o n e sp a r al a sl e t r a s n i c a sd ed o sp a l a b r a s . . . > > >a=s e t ( ' a b r a c a d a b r a ' ) > > >b=s e t ( ' a l a c a z a m ' ) > > >a #l e t r a s n i c a se na s e t ( [ ' a ' ,' r ' ,' b ' ,' c ' ,' d ' ] ) > > >a-b #l e t r a se nap e r on oe nb s e t ( [ ' r ' ,' b ' ,' d ' ] ) > > >a|b #l e t r a se naoe nb s e t ( [ ' a ' ,' c ' ,' b ' ,' d ' ,' m ' ,' l ' ,' r ' ,' z ' ] ) > > >a&b #l e t r a se naye nb s e t ( [ ' a ' ,' c ' ] ) > > >a^b #l e t r a se naobp e r on oe na m b o s s e t ( [ ' b ' ,' d ' ,' m ' ,' l ' ,' r ' ,' z ' ] )
5.5. Diccionarios
Otro tipo de dato til includo en Python es el diccionario (ver typesmapping). Los diccionarios se encuentran a veces en otros lenguajes como memorias asociativas o arreglos asociativos. A diferencia de las secuencias, que se indexan mediante un rango numrico, los diccionarios se indexan con claves, que pueden ser cualquier tipo inmutable; las cadenas y nmeros siempre pueden ser claves. Las tuplas pueden usarse como claves si solamente contienen cadenas, nmeros o tuplas; si una tupla contiene cualquier objeto mutable directa o indirectamente, no puede usarse como clave. No pods usar listas como claves, ya que las listas pueden modificarse usando asignacin por ndice, asignacin por seccin, o mtodos como a p p e n d ( )y e x t e n d ( ) . Lo mejor es pensar en un diccionario como un conjunto no ordenado de pares clave: valor,
http://docs.python.org.ar/tutorial/2/datastructures.html 8/12
6/4/2014
con el requerimiento de que las claves sean nicas (dentro de un diccionario en particular). Un par de llaves crean un diccionario vaco: { } . Colocar una lista de pares clave:valor separados por comas entre las llaves aade pares clave:valor iniciales al diccionario; esta tambin es la forma en que los diccionarios se presentan en la salida. Las operaciones principales sobre un diccionario son guardar un valor con una clave y extraer ese valor dada la clave. Tambin es posible borrar un par clave:valor con d e l . Si uss una clave que ya est en uso para guardar un valor, el valor que estaba asociado con esa clave se pierde. Es un error extraer un valor usando una clave no existente. El mtodo k e y s ( ) de un diccionario devuelve una lista de todas las claves en uso de ese diccionario, en un orden arbitrario (si la quers ordenada, simplemente us el metodo s o r t ( ) sobre la lista de claves). Para verificar si una clave est en el diccionario, utiliz la palabra clave i n . Un pequeo ejemplo de uso de un diccionario:
> > >t e l={ ' j a c k ' :4 0 9 8 ,' s a p e ' :4 1 3 9 } > > >t e l [ ' g u i d o ' ]=4 1 2 7 > > >t e l { ' s a p e ' :4 1 3 9 ,' j a c k ' :4 0 9 8 ,' g u i d o ' :4 1 2 7 } > > >t e l [ ' j a c k ' ] 4 0 9 8 > > >d e lt e l [ ' s a p e ' ] > > >t e l [ ' i r v ' ]=4 1 2 7 > > >t e l { ' j a c k ' :4 0 9 8 ,' i r v ' :4 1 2 7 ,' g u i d o ' :4 1 2 7 } > > >t e l . k e y s ( ) [ ' j a c k ' ,' i r v ' ,' g u i d o ' ] > > >' g u i d o 'i nt e l T r u e
El constructor d i c t ( ) crea un diccionario directamente desde listas de pares clave-valor guardados como tuplas. Cuando los pares siguen un patrn, se puede especificar de forma compacta la lista de pares clave-valor por comprensin.
> > >d i c t ( [ ( ' s a p e ' ,4 1 3 9 ) ,( ' g u i d o ' ,4 1 2 7 ) ,( ' j a c k ' ,4 0 9 8 ) ] ) { ' s a p e ' :4 1 3 9 ,' j a c k ' :4 0 9 8 ,' g u i d o ' :4 1 2 7 } > > >d i c t ( [ ( x ,x * * 2 )f o rxi n( 2 ,4 ,6 ) ] ) #u s eal i s tc o m p r e h e n s i o n { 2 :4 ,4 :1 6 ,6 :3 6 }
Ms adelante en este tutorial, aprenderemos acerca de Expresiones Generadoras que estn mejor preparadas para la tarea de proveer pares clave-valor al constructor d i c t ( ) . Cuando las claves son cadenas simples, a veces resulta ms fcil especificar los pares usando argumentos por palabra clave:
> > >d i c t ( s a p e = 4 1 3 9 ,g u i d o = 4 1 2 7 ,j a c k = 4 0 9 8 ) { ' s a p e ' :4 1 3 9 ,' j a c k ' :4 0 9 8 ,' g u i d o ' :4 1 2 7 }
http://docs.python.org.ar/tutorial/2/datastructures.html
9/12
6/4/2014
Cuando se itera sobre una secuencia, se puede obtener el ndice de posicin junto a su valor correspondiente usando la funcin e n u m e r a t e ( ) .
> > >f o ri ,vi ne n u m e r a t e ( [ ' t a ' ,' t e ' ,' t i ' ] ) : . . . p r i n ti ,v . . . 0t a 1t e 2t i
Para iterar sobre dos o ms secuencias al mismo tiempo, los valores pueden emparejarse con la funcin z i p ( ) .
> > >p r e g u n t a s=[ ' n o m b r e ' ,' o b j e t i v o ' ,' c o l o rf a v o r i t o ' ] > > >r e s p u e s t a s=[ ' l a n c e l o t ' ,' e ls a n t og r i a l ' ,' a z u l ' ] > > >f o rp ,ri nz i p ( p r e g u n t a s ,r e s p u e s t a s ) : . . . p r i n t' C u a le st u{ 0 } ? { 1 } . ' . f o r m a t ( p ,r ) . . . C u a le st un o m b r e ? l a n c e l o t . C u a le st uo b j e t i v o ? e ls a n t og r i a l . C u a le st uc o l o rf a v o r i t o ? a z u l .
Para iterar sobre una secuencia en orden inverso, se especifica primero la secuencia al derecho y luego se llama a la funcin r e v e r s e d ( ) .
> > >f o rii nr e v e r s e d ( x r a n g e ( 1 , 1 0 , 2 ) ) : . . . p r i n ti . . . 9 7 5 3 1
Para iterar sobre una secuencia ordenada, se utiliza la funcin nueva lista ordenada dejando a la original intacta.
s o r t e d ( ) la
> > >c a n a s t a=[ ' m a n z a n a ' ,' n a r a n j a ' ,' m a n z a n a ' ,' p e r a ' ,' n a r a n j a ' ,' b a n a n a ' ] > > >f o rfi ns o r t e d ( s e t ( c a n a s t a ) ) :
http://docs.python.org.ar/tutorial/2/datastructures.html 10/12
6/4/2014
. . . p r i n tf . . . b a n a n a m a n z a n a n a r a n j a p e r a
Los operadores de comparacin i ny n o t i n verifican si un valor est (o no est) en una secuencia. Los operadores i se i sn o t comparan si dos objetos son realmente el mismo objeto; esto es significativo slo para objetos mutables como las listas. Todos los operadores de comparacin tienen la misma prioridad, la cual es menor que la de todos los operadores numricos. Las comparaciones pueden encadenarse. Por ejemplo, by adems si bes igual a c .
a<b= = c verifica
si
a es
menor que
Las comparaciones pueden combinarse mediante los operadores booleanos a n dy o r , y el resultado de una comparacin (o de cualquier otra expresin booleana) puede negarse con n o t . Estos tienen prioridades menores que los operadores de comparacin; entre ellos n o t tiene la mayor prioridad y o r la menor, o sea que A a n dn o tB o r C equivale a ( Aa n d( n o tB ) ) o rC . Como siempre, los parntesis pueden usarse para expresar la composicin deseada. Los operadores booleanos a n d y o r son los llamados operadores cortocircuito: sus argumentos se evalan de izquierda a derecha, y la evaluacin se detiene en el momento en que se determina su resultado. Por ejemplo, si A y C son verdaderas pero B es falsa, en A a n d Ba n d C no se evala la expresin C . Cuando se usa como un valor general y no como un booleano, el valor devuelto de un operador cortocircuito es el ltimo argumento evaluado. Es posible asignar el resultado de una comparacin u otra expresin booleana a una variable. Por ejemplo,
> > >c a d e n a 1 ,c a d e n a 2 ,c a d e n a 3=' ' ,' T r o n d h e i m ' ,' P a s oH a m m e r ' > > >n o n _ n u l o=c a d e n a 1o rc a d e n a 2o rc a d e n a 3 > > >n o n _ n u l o ' T r o n d h e i m '
Not que en Python, a diferencia de C, la asignacin no puede ocurrir dentro de expresiones. Los programadores de C pueden renegar por esto, pero es algo que evita un tipo de problema comn encontrado en programas en C: escribir =en una expresin cuando lo que se quiere escribir es = = .
http://docs.python.org.ar/tutorial/2/datastructures.html 11/12
6/4/2014
Observ que comparar objetos de diferentes tipos es legal. El resultado es determinstico pero arbitrario: los tipos se ordenan por su nombre. Por lo tanto, una lista ( l i s t ) siempre evala como menor que una cadena ( s t r i n g ). Los tipos numricos diferentes se comparan a su valor numrico, o sea 0 es igual a 0.0, etc. No confiar demasiado en las reglas para comparar objetos de diferentes tipos; pueden cambiar en una versin futura del lenguaje.
http://docs.python.org.ar/tutorial/2/datastructures.html
12/12