Mostrando entradas con la etiqueta cadenas. Mostrar todas las entradas
Mostrando entradas con la etiqueta cadenas. Mostrar todas las entradas

12 de mayo de 2016

17. Más sobre listas. Tuplas.

Listas: más sobre ellas. Notación de rangos y métodos interesantes.

Observa este programa.

# *-* coding:utf-8 *-*
xs = [2003, 6789, 5488, 3245]

print xs

print ("Longitud de la lista: %d") % (len(xs))

print ("Primer elemento %d") % (xs[0])
print ("Último elemento %d") % (xs[3])

print ("Sublista, del principio hasta el elemento 1 %s") % (xs[:1])
print ("Del elemento 0 al elemento 1-1, o sea, el 0")
print ("Recuerda, el orden de una lista empieza en el índice 0\n")

print ("Sublista [1:1] %s") % (xs[1:1])
print ("Recuerda, del elemento 1 al elemento 1-1=0... Inexistente\n")

print ("Sublista [1:2] %s") % (xs[1:2])
print ("Del elemento 1 al elemento 2-1, o sea, el 1. \n")

print ("Sublista [1:4] %s") % (xs[1:4])
print ("Del elemento 1 al elemento 4-1, o sea, el 3. \n")

print ("Sublista,. Menos el último [:-1] %s") % (xs[:-1])
print ("Sublista,  Menos los dos últimos [:-2] %s") % (xs[:-2])

print ("Sublista, el último [-1:] %s") % (xs[-1:])
print ("Sublista, los dos últimos [-2:] %s") % (xs[-2:])
===

Otras operaciones de lista

# *-* coding:utf-8 *-*
xs = [2003, 6789, 5488, 3245]

print xs

xs[1] = 10325

print ("Cambio un elemento de la lista - índice 1: %s") % (xs)

xs.append(9999)

print ("Añado un elemento al final: %s") % (xs)

xs.insert(2, 2332)

print ("Inserto un elemento con índice 2: %s") % (xs)

xs.insert(2, 9999)

print ("Inserto un elemento con índice 2, de nuevo, el anterior pasa al 3: %s") % (xs)

xs.remove(2332)

print ("Quitar un elemento de la lista, el 2332: %s") % (xs)

xs.remove(9999)

print ("Quitar un elemento de la lista, el 9999: %s") % (xs)
print ("Si el elemento está repetido, se quita el primero de la lista ")
print ("Si intento quitar uno que no exista, da un error")

estaONo = 5488 in xs
print ("Comprobar si está o no en la lista %s") % (estaONo)

indice = xs.index(5488)
print ("Devueleve el índice o posición de un elemento, 5488: %d") % (indice)
print ("%s") % (xs)
===

Tuplas. Elementos inmutables.

A diferencia de las listas, cuyos elementos pueden cambiar, vamos ahora a estudiar las tuplas. Las tuplas, una vez definidas en el programa son inmutables, es decir , no se pueden cambiar. Pero se pueden construir de elementos de distinto tipo. Por ejemplo,
# *-* coding:utf-8 *-*
# TUPLAS

fecha = (10,"Enero",2015)

# Esto no se puede hacer:  print ("La fecha es %s") % (fecha)

print fecha

print ("\nSe puede usar la notación por rangos, vista antes para las listas")
print fecha[:2]

# Esto no se puede hacer:   fecha[2] = 2016, ya que son inmutables.Enero

print ("\nSe puede calcular su longitud")
print len(fecha)

print ("\nSe pueden definir tuplas unitarias; no olvidar la COMA")
unitaria = (1234, )  # Si se pone unitaria = (1234) NO FUNCIONA
print len(unitaria)
print unitaria
===
Las tuplas se pueden EMPAQUETAR, es decir, varias variables se pueden almacenar en una tupla. Y también DESEMPAQUETAR.
# *-* coding:utf-8 *-*
# EMPAQUETAR TUPLAS
dia = 10
mes = "Junio"
anno = 2015

fecha = dia, mes, anno

print fecha

# DESEMPAQUETAR TUPLAS
dia2, mes2, anno2 = fecha
print dia2
print ("En el mes de %s") % (mes2)
print ("dentro de dos años %d") % (anno2 + 2)
= = =

Las cadenas son listas y se pueden hacer muchas cosas con ellas

Las cadenas son listas, de caracteres, y como tal pueden ser tratadas.
Por ejemplo se les puede asignar la notación de rangos para obtener subcadenas o substrings.
# *-* coding:utf-8 *-*

miCadena = "Esta es una frase o conjunto de palabras con sentido"
print miCadena
print miCadena[3:]
print miCadena[:-2]
print miCadena[-2]
print miCadena[4:24]
===
Pero las cadenas tienen métodos particulares. Por ejemplo:
  1. Separar la cadena por uno o varios conjuntos de caracteres. Función split. Esta función acepta como argumento el carácter por el cual se va a dividir.
  2. Unir con el método join una lista en una nueva cadena, usando otro separador.
# *-* coding:utf-8 *-*

miCadena = "Esta es una frase o conjunto de palabras con sentido"

print miCadena

# Separando la cadena por el caracter espacio
# no hace falta. En el caso del espacio es el caracter por defecto. Funcionaría
# cs = miCadena.split()
cs = miCadena.split(" ")
print cs

# Vuelvo a unirla, pero usando los caracteres ---
miCadena2 = "---".join(cs)
print miCadena2
===
Para más información, y para encontrar muchos más métodos referidos al objeto String, se puede ver esta web: http://librosweb.es/libro/python/capitulo_6.html

Ordenando listas

Los elementos de una lista pueden ordenarse de dos formas:
  1. La lista se puede convertir en una lista ordenada. Método sort o reverse
  2. La lista puede copiarse a otra lista ordenada: función sorted.
# *-* coding:utf-8 *-*

miLista = [15, 10, 4, 7, 5, 3, 4]

miListaOrdenada = sorted(miLista)

print ("La lista desordenada es %s y la ordenada %s") % (miLista, miListaOrdenada)

print("... pero puedo convertir la lista original en una que ya se queda ordenada")

miLista.sort()

print ("La lista ya ordenada %s") % (miLista)

print("pero la puedo ordenar en orden inverso")

miLista.reverse()

print ("La lista en orden inverso %s") % (miLista)
===
¿Qué ocurre con cadenas de caracteres?
# *-* coding:utf-8 *-*

miLista = ["cC","bB", "dD", "aA"]
print sorted(miLista)

# cuidado, y si las mayúsculas y las minúsculas están
# alternadas como primera letra ¿¿??
miLista = ["Cc","bB", "Dd", "aA"]
print sorted(miLista)
# Ordena PRIMERO LAS MAYÚSCULAS y después las minúsculas.

# A menos que use un criterio de ordenación
print sorted(miLista, key=str.lower)
# En este caso la ordena como si las mayúsculas las hubiera convertido a minúsculas.

# O al revés...
print sorted(miLista, key=str.upper)

#¿Qué ordena antes, números o letras?
miLista2 = [7, "cC", 2, 5, 1, "aA", 3, "fF", 0.1, 5.32]
print sorted(miLista2)

# o al revés
aa = sorted(miLista2, reverse=True)
print aa

bb = aa + miLista2
print sorted(bb)
===
Y un poco más
# *-* coding:utf-8 *-*

miCadena ="Frase rimbombante"

miCadena2 = sorted(miCadena, key=str.lower)
print miCadena2

print ("Número de caracteres: %d") % (len(miCadena2))
print ("Número de caracteres \"a\": %d") % (miCadena.count("a"))

11 de mayo de 2016

07. Cadenas de caracteres en Python

Ejemplo 1. Elementos especiales en las cadenas
Ya hemos definido variables que son cadenas de caracteres. y ya hemos visto que se encerraban entre comillas simples (apóstrofes ' ' ) o comillas dobles (" ").
¿Qué ocurriría, sin embargo, si defino la siguiente cadena (en inglés)?
miCadena = 'Hi, I'm the new teacher'
print miCadena
Si probáis el ejemplo en el IDE, el programa arroja el siguiente error: SyntaxError: invalid syntax. Probad ahora con el siguiente ejemplo: 
miCadena = 'Hi, I\'m the new teacher'
print miCadena
Escribiendo el carácter de escape \ , el programa obvia la condición de cierre del apóstrofe y lo interpreta como carácter.
===
Ejemplo 2. Una forma más fácil de evitarlo
miCadena = "Hi, I'm the new teacher"
print miCadena
Simplemente, combino las dobles comillas como delimitadores de cadena y el apóstrofe ya es un carácter.
===
Ejemplo 3. Pero hay más caracteres con \
# *-* coding:utf-8 *-*
miCadena = "Primera línea\nSegunda línea"
print miCadena

En este ejemplo, \n es un retorno de carro. Se salta una línea.
===
Intenta también estos ejemplos especiales
A. cadenas "en bruto", empezando con r
# *-* coding:utf-8 *-*
miCadena1 = "Primera línea\nSegunda línea"
miCadena2 = r"Primera línea\nSegunda línea"
print miCadena1
print miCadena2
B. cadenas literales, con tres """... """ o '''... '''
print """
Hola, este es un                        gran ejemplo
............                  de como se imprimen cadenas literales"""
C. Y añadiendo slashes (al final de la palabra ejemplo)
print """
Hola, este es un                        gran ejemplo\
............                  de como se imprimen cadenas literales"""
 
 

Caracteres dentro de una cadena

Una cadena o string puede considerarse una lista de caracteres. De hecho, puede accederse a cada letra o carácter a través de la posición que ocupa en ella.
Por ejemplo, la palabra CASA tiene 4 caracteres. El primer carácter, se cuenta como carácter 0 es la "C". Asimismo, el carácter 1 es la "A", el 2, la "S" y el 3, "A".
Intenta este ejemplo
Ejemplo 1. Palabra "CASA" letra a letra.
miCadena = "CASA"
for caracter in miCadena:
     print caracter+"\n"
Y de otra forma, con un bucle numérico y la función range
miCadena = "CASA"
longitud = len(miCadena)
print "Longitud: "+str(longitud)+"\n"
for i in range (0,longitud):
     print "i: "+str(i)+" --> "+miCadena[i]+"\n"

Ejemplo 2. Y ahora, al revés
miCadena = "CASA"
longitud = len(miCadena)
print "Longitud: "+str(longitud)+"\n"
for i in range (longitud,0,-1):
    print "i: "+str(i-1) +"  -->  "+miCadena[i-1]+"\n"

O bien
miCadena = "CASA"
longitud = len(miCadena)
print "Longitud: "+str(longitud)+"\n"
for i in range (longitud-1,-1,-1):
    print "i: "+str(i) +"  -->  "+miCadena[i]+"\n"

O bien
miCadena = "CASA"
miCadena2= ""
for caracter in miCadena:
    miCadena2 = caracter + miCadena2
for caracter in miCadena2:
    print caracter +"\n"
 

Cadenas formadas con varios elementos: formateo de cadenas

Ejemplo 1. Formateando una cadena con tres números tipo float En este ejemplo, presentamos con print una cadena de texto formada por una cadena de texto previa y tres números float. El formateo se logra mediante el operador %, con una s indicando que es una cadena y una f indicando que es un número tipo float.
# *-* coding: utf-8 *-*
a = 2.3212
b = 3.45456
c = "La suma de dos números"

print "%s, %f + %f es %f" % (c,a,b,a+b)
===
Podemos controlar el número de decimales de los float con la notación %.2f (2 decimales).
...
print "%s, %.2f + %.2f es %.2f" % (c,a,b,a+b)
===
Ejemplo 2. Formateo una cadena con números enteros
Cuando tengo un integer, o número entero, necesito la notación %d
# *-* coding: utf-8 *-*
a = 2
b = 3.45456
c = "La suma de dos números"

print "%s, %d + %.2f es %.2f" % (c,a,b,a+b)
Pero.. ¿Qué ha ocurrido? El programa presenta el resultado pero hemos sumado un número entero a un número tipo float. El resultado hay que expresarlo en ese tipo. Observa la diferencia si sustituyes el print por esta línea
print "%s, %d + %.2f es %d" % (c,a,b,a+b)
===
Ejemplo 3. Puedo forzar la conversión de números usando estas funciones
  • int(a): convierto un número a entero o integer.
  • float(a): convierto un número a tipo float o real
  • str(a): convierto un número a cadena de texto...
Observa y comenta los resultados de este programa:
# *-* coding: utf-8 *-*
from math import atan, sin
a = 4*atan(1) #una forma de escribir el número pi
b = sin(a/3) #seno de 60º

print a,b
print str(a),str(b)

print a+b
print str(a)+str(b)

print int(a+b)
print int(a)+int(b)

print b/a
print int(b)/int(a)
print int(b/a)

print float(int(a*100))/100
 

Métodos de funciones de texto

Los métodos de string son funciones aplicables a cadenas de caracteres que devuelven datos concretos. Veremos los siguientes:
  1. len(cadena) --> Longitud de la cadena.
  2. lower() --> Convierte una cadena en minúsculas.
  3. upper() --> Convierte la cadena en mayúsculas.
Mientras la primera lleva la variable entre paréntesis las dos últimas se ejecutan con .[método]() (o notación de puntos). La notación de puntos puede ser literal, y se ejecuta sólo con strings, mientras len() admite como argumento otra serie de objetos.
Ejemplo
# *-* coding: utf-8 *-*
miCadena="Esta es UNA cadena de texto"

print len(miCadena)
print miCadena.upper()
print miCadena.lower()

print "Otra Cadena De Texto".upper()
print "Otra Cadena De Texto".lower()
===

¡Hey, tú! ¡Dame lo que te pido!

Hasta ahora el programador ha sido quien escribe en el programa los datos que se han expuesto o con los que se ha calculado. ¿Pero siempre tenemos al programador para obtener esos datos? Evidentemente no. Necesitamos interactuar con el usuario, preguntarle qué datos necesita. Por eso, ahora veremos la función raw_input (entrada "en bruto")
Imagina un programa que le pide a una persona su peso, su altura y su nombre, para poder calcular su índice de masa corporal... ¿Cómo empezaría el programa?
Ejemplo
# *-* coding: utf-8 *-*
miNombre = raw_input("Por favor, dime tu nombre: ")
miPeso = float(raw_input("Dime tu peso en kilogramos: "))
miAltura = float(raw_input("Dime tu altura en centímetros: "))

print "Tu nombre es %s, tu peso %.2f Kg y tu altura %.2f cm" % (miNombre,miPeso,miAltura)