Módulos
El módulo collections
Contador
Es una subclase de diccionario utilizada para realizar cuentas.
Cuenta las veces que hay repetido un elemento, sea númerico o caracter.
from collections import Counter
l = [1,2,3,4,1,2,3,1,2,1]
Counter(l)
Counter({1: 4, 2: 3, 3: 2, 4: 1})
p = "palabra"
Counter(p)
Counter({'a': 3, 'b': 1, 'l': 1, 'p': 1, 'r': 1})
animales = "gato perro canario perro canario perro"
Counter(animales)
Counter({' ': 5,
'a': 5,
'c': 2,
'e': 3,
'g': 1,
'i': 2,
'n': 2,
'o': 6,
'p': 3,
'r': 8,
't': 1})
Con split separamos por palabras
animales.split()
['gato', 'perro', 'canario', 'perro', 'canario', 'perro']
Ahora podemos contar las palabras repetidas
Counter(animales.split())
Counter({'canario': 2, 'gato': 1, 'perro': 3})
most_common()
Permite mostrar los mas comunes
c = Counter(animales.split())
c.most_common(1)
[('perro', 3)]
c.most_common(2)
[('perro', 3), ('canario', 2)]
c.most_common()
[('perro', 3), ('canario', 2), ('gato', 1)]
Tuplas con nombres
Subclase de las tuplas utilizada para crear pequeñas estructuras inmutables, parecidas a una clase y sus objetos pero mucho más simples.
t = (20,40,60)
t[0]
20
t[-1]
60
from collections import namedtuple
Persona = namedtuple('Persona','nombre apellido edad')
p = Persona(nombre="Hector",apellido="Costa",edad=27)
p.nombre
'Hector'
p.apellido
'Costa'
p.edad
27
p
Persona(nombre='Hector', apellido='Costa', edad=27)
p[0]
'Hector'
p[1]
'Costa'
p[-1]
27
Al ser una tupla, no se puede modificar
p.nombre = "Hola"
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-91-5cd7aba08457> in <module>()
----> 1 p.nombre = "Hola"
AttributeError: can't set attribute
El módulo datetime
import datetime
dt = datetime.datetime.now() # Ahora
dt
datetime.datetime(2016, 6, 18, 21, 29, 28, 607208)
dt.year # año
2016
dt.month # mes
6
dt.day # día
18
print("{}:{}:{}".format(dt.hour, dt.minute, dt.second))
21:29:28
print("{}/{}/{}".format(dt.day, dt.month, dt.year))
18/6/2016
Crear un datetime manualmente (year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Notad que sólo son obligatorios el año, el mes y el día
dt = datetime.datetime(2000,1,1)
dt
datetime.datetime(2000, 1, 1, 0, 0)
dt.year = 3000 # Error en asignación
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-18-f655491f2afa> in <module>()
----> 1 dt.year = 3000
AttributeError: attribute 'year' of 'datetime.date' objects is not writable
dt = dt.replace(year=3000) # Asignación correcta con .replace()
dt
datetime.datetime(3000, 1, 1, 0, 0)
Formateos
Formato automático ISO (Organización Internacional de Normalización)
dt = datetime.datetime.now()
dt.isoformat()
'2016-06-18T21:37:10.303386'
Formateo munual (inglés por defecto)
dt.strftime("%A %d %B %Y %I:%M")
'Saturday 18 June 2016 09:37'
tiempo con timedelta
dt = datetime.datetime.now()
dt
datetime.datetime(2016, 6, 18, 21, 47, 13, 504534)
t = datetime.timedelta(days=14, hours=4, seconds=1000)
dentro_de_dos_semanas = dt + t
dentro_de_dos_semanas
datetime.datetime(2016, 7, 3, 2, 3, 53, 504534)
dentro_de_dos_semanas.strftime("%A %d de %B del %Y - %H:%M")
'domingo 03 de julio del 2016 - 02:03'
hace_dos_semanas = dt - t
hace_dos_semanas.strftime("%A %d de %B del %Y - %H:%M")
'sábado 04 de junio del 2016 - 17:30'
Códigos de idiomas
- https://msdn.microsoft.com/es-es/es/library/cdax410z.aspx
import locale
locale.setlocale(locale.LC_ALL, 'es-ES') # Establece idioma en "es-ES" (español de España)
locale.setlocale(locale.LC_ALL, '') # Establece idioma del sistema
'es-ES'
dt.strftime("%A %d %B %Y %I:%M")
'sábado 18 junio 2016 09:37'
dt.strftime("%A %d de %B del %Y - %H:%M") # %I 12h - %H 24h
'sábado 18 de junio del 2016 - 21:37'
Extra: Zonas horarias con pytz
pip3 install pytz
import pytz
pytz.all_timezones
['Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
'Africa/Algiers',
'Africa/Asmara',
'Africa/Asmera',
'Africa/Bamako',
'Africa/Bangui',
'Africa/Banjul',
'Africa/Bissau',
'Africa/Blantyre',
'Africa/Brazzaville',
'Africa/Bujumbura',
'Africa/Cairo',
'Africa/Casablanca',
'Africa/Ceuta',
'Africa/Conakry',
'Africa/Dakar',
'Africa/Dar_es_Salaam',
'Africa/Djibouti',
'Africa/Douala',
'Africa/El_Aaiun',
'Africa/Freetown',
...
# salen muchos, todos los del mmundo.
dt = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
dt.strftime("%A %d de %B del %Y - %H:%M") # %I 12h - %H 24h
'domingo 19 de junio del 2016 - 04:52'
El módulo math
import math
Redondeos
pi = 3.14159
round(pi) # Redondeo integrado
3
math.floor(pi) # Redondeo a la baja - Suelo
3
math.floor(3.99)
3
math.ceil(pi) # Redondeo al alta - Techo
4
math.ceil(3.01)
4
Valor absoluto
abs(-10)
10
Sumatorio
# Sumatorio integrado
n = [0.9999999, 1, 2, 3]
sum(n)
6.999999900000001
# Sumatorio mejorado para números reales
math.fsum(n)
6.9999999
Truncamiento
math.trunc(123.45) # Truncar, cortar la parte decimal
123
Potencias y raíces
math.pow(2, 3) # Potencia con flotante
8.0
2 ** 3 # Potencia directa
8
math.sqrt(9) # Raíz cuadrada (square root)
3.0
Constantes
math.pi # Constante pi
3.141592653589793
math.e # Constante e
2.718281828459045
El módulo random
import random
random.random() # Flotante aleatorio >= 0 y < 1.0
0.12539542779843138
random.random() # Flotante aleatorio >= 0 y < 1.0
0.3332807222427663
random.uniform(1,10) # Flotante aleatorio >= 1 y <10.0
6.272300429556777
random.randrange(10) # Entero aleatorio de 0 a 9, 10 excluído
7
random.randrange(0,101) # Entero aleatorio de 0 a 100
14
random.randrange(0,101,2) # Entero aleatorio de 0 a 100 cada 2 números, múltiples de 2
68
random.randrange(0,101,5) # Entero aleatorio de 0 a 100 cada 5 números, múltiples de 5
25
c = 'Hola mundo'
random.choice(c) # letra aleatoria
'o'
l = [1,2,3,4,5]
random.choice(l) # elemento aleatorio
3
random.shuffle(l) # barajar una lista, queda guardado
l
[3, 4, 2, 5, 1]
random.sample(l, 2) # muestra aleatoria de 2 elementos de la lista
[3, 4]
regex
Las funciones de este módulo permiten comprobar si una determinada cadena coincide con una expresión regular dada.
El uso de las expresiones regulares en Python viene dado por el paquete re, que hay que importar a nuestro código.
import re
re.match
re.match() Si hay cero o más caracteres al comienzo de la cadena que coincide con el patrón de expresión regular
texto = "Programa en Python"
buscar = re.match("Programa", texto)
print(buscar)
<re.Match object; span=(0, 8), match='Programa'>
buscar.string
'Programa en Python'
buscar.group()
'Programa'
buscar.span()
(0, 8)
buscar.start()
0
buscar.end()
8
re.search
re.search(patrón, cadena): busca la primera ocurrencia de la expresión regular definida en patrón dentro del string cadena.
encontro = re.search("Python", "Programa en Python Python")
encontro
<re.Match object; span=(12, 18), match='Python'>
re.findall
re.findall(patrón, cadena): devuelve una lista que contiene todas las ocurrencias de la expresión regular definida en patrón dentro del string cadena.
import re
re.findall("Python", "En este curso de Python, aprenderemos a programar en Python y nos convertiremos en Pythonista.")
['Python', 'Python', 'Python']
Si quieres utilizar una variable como ptrón tentras que compilasrla primero
patron = re.compile('^Python')
frase = "Python es un lenguaje de programación. Python"
re.findall(patron, frase)
['Python']
re.finditer
finditer(): El cual es similar a re.findall, pero en lugar de devolvernos una lista nos devuelve un iterador.
encontrados = re.finditer("Python", "En este curso de Python, aprenderemos a programar en Python y nos convertiremos en Pythonista.")
for encontro in encontrados:
print(encontro)
<re.Match object; span=(17, 23), match='Python'>
<re.Match object; span=(53, 59), match='Python'>
<re.Match object; span=(83, 89), match='Python'>
re.sub
re.sub(patrón, repl, string): reemplaza las coincidencias con el texto de su elección (repl).
import re
txt = "Se esperan abundantes lluvias"
x = re.sub("\s", "-", txt) # "\s espacio en blanco en RE
print(x)
Se-nuevo-abundantes-lluvias
re.split
re.split(separador, cadena): divide la cadena tomando en cuenta las ocurrencias del separador. El resultado se devuelve en una lista.
txt = "Se esperan abundantes lluvias"
x = re.split("\s", txt, 2) #\s espacio en blanco en RE 2 aplica el split 2 veces
print(x)
['Se', 'esperan', 'abundantes lluvias']