martes, 3 de julio de 2018

Trabajar con diccionarios en Python

Reto: Diccionarios

Dado un número del 1 al 12, mostrar el mes correspondiente y el número de días que tiene. Trabajar con diccionarios.




Método 1

Creamos el diccionario d en el que la clave son los números del 1 al 12 y el valor son los días que tiene cada mes. Consideramos que febrero siempre tiene 28 días para simplificar. Preguntamos al usuario por el més que quiere, que ha de ser un número entre 1 y 12. Creamos una tupla denominada mes con los meses del año. Observe que es una tupla porque hemos usado paréntesis en su creación. Si hubiéramos usado corchetes [] se trataría de una lista y el código también funcionaría bien. Primero imprimimos el mes consultando la tupla. Finalmente imprimimos el número de días que contiene ese mes consultando el diccionario.


d= {'1':31, '2':28, '3':31, '4':30, '5':31, '6':30, '7':31, '8':31, '9':30, '10':31, '11':30, '12':31}
x=input('¿Qué mes quiere?')
mes=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')
print(mes[int(x)-1])
print(d.get(x))


Método 2

Creamos el diccionario d donde la clave es el mes y el valor es el número de días que tiene ese mes. Creamos la lista mes con los meses del año en formato texto, a tres dígitos. Nos metemos en un bucle while True donde preguntamos al usuario por n que es el número de meses. Si n está en el rango 1 a 12 detendremos el bucle y sino seguiremos preguntando. Calculamos m consultando la lista mes. Recuerde que las listas comienzan por cero, este es el motivo por el que hemos restado 1 al proporcionar el índice de la lista. Finalmente imprimimos n, m y el número de días que contiene el mes haciendo una consulta al diccionario.

d={'Jan':31,'Feb':28,'Mar':31,'Apr':30,'May':31,'Jun':30,'Jul':31,'Aug':31,'Sep':30,'Oct':31,'Nov':30,'Dec':31}
mes=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
while True:
  n=int(input('Indique un mes con un número del 1 al 12:'))
  if n in range(1,13):
    break
m=mes[n-1]
print('El mes',n,'es', m,'y tiene',d[m],'días.')


Método 3

Generamos un número aleatorio entre 1 y 12. Definimos dos diccionarios donde en ambos la clave es un número entero entre 1 y 12. El primer diccionario contiene el nombre del mes y el segundo los días de ese mes. Finalmente imprimimos el valor numérico generado de forma aleatoria n, consultamos el diccionario primero para obtener el mes y el segundo para obtener el número de días que contiene.

import random
random.seed()
n=random.randint(1,12)
a={1:'Jan',2:'Feb',3:'Mar',4:'Apr',5:'May',6:'Jun',7:'Jul',8:'Aug',9:'Sep',10:'Oct',11:'Nov',12:'Dec'}
b={1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
print(' mes:',n,'-->',a[n],'\n','días =',b[n])


Método 4

Creamos un único diccionario cuyas claves son los números del 1 al 12 y cuyo valor es una lista de dos elementos, el primero es el mes y el segundo el número de días que tiene. También se podría haber usado una tupla en lugar de una lista. Si se usan corchetes se trata de una lista, y si usamos paréntesis se trata de una tupla.
Con un bucle for recorremos todos los elementos del diccionario y vamos llamando a los elementos dos elementos de la lista que contienen.

d={1:['Jan',31],2:['Feb',28],3:['Mar',31],4:['Apr',30],5:['May',31],6:['Jun',30],7:['Jul',31],8:['Aug',31],9:['Sep',30],10:['Oct',31],11:['Nov',30],12:['Dec',31]}
for i in range(1,13):
  print(i,':',d[i][0],d[i][1])


Método 5

Definimos la lista mes y la lista dias. También creamos la lista num generándola con range. Vamos a crear dos diccionarios d1 y d2 usando zip y dict. Lo que hace zip es unir dos iterables y dict convierte el resultado en un diccionario.
Con un bucle for recorremos todos los números de 1 al 12 y vamos llamando a los elementos de los dos diccionarios.

mes=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
dias=[31,28,31,30,31,30,31,31,30,31,30,31]
num=list(range(1,13))
d1=dict(zip(num,mes))
d2=dict(zip(num,dias))
for i in range(1,13):
  print(i,d1[i],d2[i])


Método 6

Este método es similar al anterior si bien usa un único diccionario. La función zip agrupa dos o más iterables, y los convierte en una tupla. Aquí lo usamos dos veces, la primera permite crear una tupla con el mes y los días que tiene ese mes. La segunda vez que se usa la función zip agrupa un número correlativo entre 1 y 12 con la tupla anterior y aprovechamos a convertir el resultado en un diccionario usando dict. De esta forma hemos obtenido un único diccionario denominado d que mostramos seguidamente.



mes=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
dias=[31,28,31,30,31,30,31,31,30,31,30,31]
num=list(range(1,13))
tupla=zip(mes,dias)
d=dict(zip(num,tupla))
for i in range(1,13):
  texto=''
  if i<10: --="" i="" str="" texto=""> '+d[i][0]+' '+str(d[i][1])
  print(texto)


Método 7

En este método usamos la función incluida en Python denominada enumerate que lo que hace es añadir a un objeto iterable una sucesión de números que comienza por cero. Si queremos que comience por 1 tenermos que añadir start=1.



mes=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
dias=[31,28,31,30,31,30,31,31,30,31,30,31]
d=dict(enumerate(zip(mes,dias), start=1))
for i in d:
    print(i,d[i])

1 comentario:

  1. lista=[]
    meses={'Enero':31,'Febrero':28,'Marzo':31,'Abril':30,'Mayo':31,'Junio':30,'Julio':31,'Agosto':31,'Septiembre':30,'Octubre':31,'Noviembre':30,'Diciembre':31}
    for valor in meses.keys():
    lista.append(valor)
    while (mes:=int(input('Dime un numero del 1 al 12: ')))not in range(1,13): pass
    nombre_mes=lista[mes-1]
    print('el mes {} tiene {} días.'.format(nombre_mes,meses[nombre_mes]))

    ResponderEliminar