Ejercicios de Introducción a Python#
Exercise 41
Crea una función merge
que acepte un número arbitrario de diccionarios y devuelva un diccionario cuyas claves sean las uniones de las claves de los diccionarios de entradas y los valores listas donde se concatenan los valores de los diccionarios originales. Por ejemplo,
dict1 = {
"foo": 1,
"bar": [3, 4],
"baz": None
}
dict2 = {
"foo": "Hello world",
5: "five"
}
dict3 = {
"bar": "yes"
}
>>> merge(dict1, dict2, dict3)
{
'foo': [1, 'Hello world'],
'bar': [[3, 4], 'yes'],
'baz': [None],
5: ['five']
}
d = {"a": "foo", "b": "bar"}
for k in d:
print(k)
a
b
def merge(*args):
merge_dict = {}
for dictionary in args:
# iterar sobre las claves de dictionary
for key in dictionary:
if key in merge_dict:
merge_dict[key].append(dictionary[key])
else:
merge_dict[key] = [dictionary[key]]
return merge_dict
dict1 = {
"foo": 1,
"bar": [3, 4],
"baz": None
}
dict2 = {
"foo": "Hello world",
5: "five"
}
dict3 = {
"bar": "yes"
}
merge(dict1, dict2, dict3)
{'foo': [1, 'Hello world'], 'bar': [[3, 4], 'yes'], 'baz': [None], 5: ['five']}
Exercise 42
Considera el siguiente ejemplo
a = [1, 2, [3, 4]]
b = list(a)
¿Cambia algún elemento de la lista a
tras ejecutar b.append(100)
?¿Y tras ejecutar b[2][0] = -100
? ¿Por qué?
a = [1, 2, [3, 4]]
b = list(a)
b[2][0] = -100
print(a)
[1, 2, [-100, 4]]
Exercise 43
Crea una función concat_to_str
que convierta una secuencia de objetos de Python en una cadena de transcripciones siguiendo las siguientes normas:
Si el objeto es un entero, entonces escribimos cada dígito en español separados por guiones. Si el entero es negativo, lo indicamos empezando la cadena por
menos
:142
->uno-cuatro-dos
-12
->menos-uno-dos
Si el objeto es un flotante, nos quedamos con la parte entera y hacemos lo mismo que en el caso anterior añadiendo
"y decimales"
al final.12.324
->uno-dos y decimales
Si el objeto es una cadena, lo dejamos como está.
Si el objeto es de otro tipo (incluido
bool
), añadimos"<OTRO>"
.
Las transcripciones deben estar separas por " | "
. Por ejemplo,
>>> s = concat_to_str([12, -14.23, "hello", True, None, 10.1, 5])
"uno-dos | menos-uno-cuatro y decimales" | hello | <OTRO> | <OTRO> | uno-cero y decimales | cinco"
[i for i in str(-5438543)]
['-', '5', '4', '3', '8', '5', '4', '3']
def traduce(objeto):
if isinstance(objeto, int) and not isinstance(objeto, bool):
return traduce_entero(objeto)
if isinstance(objeto, float):
return traduce_flotante(objeto)
if isinstance(objeto, str):
return objeto
return "<OTRO>"
def traduce_entero(n):
n_str = str(n)
digits = [i for i in n_str]
return "-".join([traduce_digito(digit) for digit in digits])
traductor_digitos = {
"1": "uno",
"2": "dos",
"3": "tres",
"4": "cuatro",
"5": "cinco",
"6": "seis",
"7": "siete",
"8": "ocho",
"9": "nueve",
"0": "cero",
"-": "menos"
}
def traduce_digito(digito):
return traductor_digitos[digito]
def traduce_flotante(f):
f_rounded = round(f)
return traduce_entero(f_rounded) + " y decimales"
def concat_to_str(iterable):
traducciones = [traduce(i) for i in iterable]
return " | ".join(traducciones)
concat_to_str([12, -14.23, "hello", True, None, 10.1, -5])
'uno-dos | menos-uno-cuatro y decimales | hello | <OTRO> | <OTRO> | uno-cero y decimales | menos-cinco'
Exercise 44
Visita este sitio web y copia el enlace de descarga de un libro a tu elección en texto plano en una variable url
. Por ejemplo, este es el enlace de descarga de Orgullo y Prejuicio.
Utiliza el módulo requests
para realizar una petición http y guardar el cuerpo de la respuesta en una variable book
tal y como se indica a continuación
import requests
url = "https://gutenberg.org/cache/epub/1342/pg1342.txt"
book_request = requests.get(url)
book = book_request.text
Escribe una función count_words
que devuelva un diccionario con las 50 palabras más frecuentes del libro que tenga como claves dichas palabras y como valor el número de apariciones.
import requests
url = "https://gutenberg.org/ebooks/2000.txt.utf-8"
book_request = requests.get(url)
book = book_request.text
book_processed = (
book
.replace("\n", " ")
.replace("\r", " ")
.replace("-", " ")
)
words = book_processed.split(" ")
words = [w.lower() for w in words if w != "" if len(w) >= 10]
results = {}
for word in words:
if word in results:
results[word] += 1
else:
results[word] = 1
results = sorted(results.items(), key=lambda item: item[1], reverse=True)[:100]
Exercise 45
Crea una clase CarritoCompra
, donde cada instancia almacenará dos listas de cadenas representando productos
una lista para productos que necesitamos,
necesitados
.otra para productos ya comprados,
comprados
.
Un producto no puede aparecer más de una vez en cada lista.
Crea un método __init__
que acepte una cadena o un iterable de cadenas representando productos que se añadirán a la lista de necesitados
y además métodos para
añade_necestidados
: añadir nuevos elementos necesitados al carrito,compra
: marcar un producto como comprado (pasa de necesitados a comprados),elimina_necesitados
,elimina_comprados
: eliminar un producto, ya sea de la lista de necesitados o comprados,lista_necestidados
ylista_comprados
: listar los elementos necesitados o comprados en orden alfabético.
[1, 2, 3].extend([4])
l = ["foo", "bar"]
l.sort()
print(l)
['bar', 'foo']
from typing import List
from collections.abc import Iterable
class CarritoCompra:
def __init__(self, necesitados: Iterable[str] = []):
self.necesitados: List = necesitados
self.comprados: List = []
def anade_necesitados(self, elementos: Iterable[str]):
self.necesitados.extend(elementos)
def compra(self, elemento: str):
self.comprados.append(elemento)
self.necesitados.remove(elemento)
def elimina_necesitados(self, elemento: str):
self.necesitados.remove(elemento)
def elimina_comprados(self, elemento: str):
self.comprados.remove(elemento)
def lista_necesitados(self):
self.necesitados.sort()
print(self.necesitados)
def lista_comprados(self):
self.comprados.sort()
print(self.comprados)
carrito = CarritoCompra()
carrito.anade_necesitados(["manzana", "pera", "pescado"])
['manzana', 'pera', 'pescado']
carrito.lista_necesitados()
carrito.lista_comprados()
carrito.compra("pescado")
carrito.compra("pera")
carrito.compra("carne")
carrito.lista_necesitados()
carrito.lista_comprados()
carrito.elimina_necesitados("pera")
carrito.elimina_necesitados("manzana")
carrito.elimina_comprados("pera")
carrito.lista_necesitados()
carrito.lista_comprados()
['manzana', 'pera', 'pescado']
[]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-62-3445b7b93df5> in <cell line: 6>()
4 carrito.compra("pescado")
5 carrito.compra("pera")
----> 6 carrito.compra("carne")
7 carrito.lista_necesitados()
8 carrito.lista_comprados()
<ipython-input-60-844dd3155c5f> in compra(self, elemento)
12 def compra(self, elemento: str):
13 self.comprados.append(elemento)
---> 14 self.necesitados.remove(elemento)
15
16 def elimina_necesitados(self, elemento: str):
ValueError: list.remove(x): x not in list
Exercise 46 (:label: return-none)
Lee este blog sobre en una función que devuelve None
es mejor
No incluir
return
Incuir solamente
return
Incluir
return None
Y pon ejemplos de cuándo deberíamos usar cada uno de ellos.