Aprenda Sobre Map, Filter, Reduce y Lambda con Python

2020-07-27 18:39:18 | #programming #python | Parte 7 de 7

Verificado En

  • Linux Ubuntu 20.04
  • Windows 10
  • macOS Catalina

Hoy, vamos a demostrar algunos conceptos de programación funcional introduciéndote a mapear, filtrar y reducir con Python.

Como funciones puras, no tienen efectos secundarios, lo que significa que no modifican el estado de los parámetros, sino que devuelven nuevos objetos. E iteran a través de la recursión, lo que significa que ejecutan repetidamente la misma función/operación por elemento.

Python Map

La función map acepta dos parámetros: una función para realizar en cada elemento de un iterable y un iterable. Debido a que map es una función pura, no modifica el iterable, pero devuelve un nuevo iterable con los valores modificados. Y si no utiliza break o continue, se ejecutará map en cada elemento, duplicando cada uno de ellos, por lo que deberá conocer los requisitos de memoria para mapear una gran colección. Si termina siendo demasiado intensivo en memoria, puede que sea mejor con un bucle for anticuado.

Inténtalo Tú Mismo


 
  

Python Filter

filter también acepta dos parámetros, pero la diferencia es que la función parametrizada que pasa debe devolver un True condicional o False. El filtro ejecuta esta función contra cada elemento, y si se evalúa como True, almacena el elemento en un nuevo iterable. De lo contrario, se salta. Este nuevo gestor iterable regresó al final del proceso. Entonces, por ejemplo, puede filtrar una lista de números y devolver una nueva lista que contenga solo los números pares:

Inténtalo Tú Mismo


 
  

Python Reduce

reduce también acepta una función y un iterable, pero en lugar de devolver un nuevo iterable, devuelve un único valor que representa el efecto acumulativo de la función que se ejecuta en cada elemento. En Python 3.x, debe importar reduce agregando la siguiente línea en la parte superior de su código: desde functools import reduce

Inténtalo Tú Mismo


 
  

Python Lambda vs. Funciones Normales

Lambda no pertenece a la misma familia de funciones puras que mapear, filtrar y reducir. Es solo una forma abreviada de realizar las operaciones de una función sin tener que definir la función con def.

Inténtalo Tú Mismo


 
  

Ejercicios de programación en Python

Resuelva los siguientes problemas, utilizando todo lo que ha aprendido hasta este punto. Siéntase libre de compartir mejores soluciones en los comentarios. Optimice cada solución, tanto como sea posible.

  1. Escriba una función de mapa de Python que acepte un diccionario y devuelva un objeto JSON. Ejecute la función de mapa con la siguiente lista de diccionarios e imprima los resultados en la consola.

    Entrada:

    biblioteca = [{
        'titulo': 'Nineteen Eighty-Four',
        'autor': 'George Orwell',
        'pais': 'Reino Unido',
        'paginas': 328,
        'generos': ['distopico', 'ficcion politica'],
        'editor': {
            'nombre': 'Secker & Warburg',
            'fecha': '1949-06-08 00:00:00'}
    }, {
        'titulo': 'Do Androids Dream of Electric Sheep?',
        'autor': 'Phillip K. Dick',
        'pais': 'Estados Unidos',
        'paginas': 210,
        'generos': ['ciencia ficcion', 'ficcion filosofica'],
        'editor': {'nombre': 'Doubleday', 'fecha': '1968-00-00 00:00:00'}
    }, {
        'titulo': 'Snow Crash',
        'autor': 'William Gibson',
        'pais': 'Estados Unidos',
        'paginas': 271,
        'generos': ['ciencia ficcion'],
        'editor': {'nombre': 'Ace', 'fecha': '1984-07-01 00:00:00'}
    }]

    Rendimiento esperado: ['{"titulo": "Nineteen Eighty-Four", "autor": "George Orwell", "pais": "Reino Unido", "paginas": 328, "generos": ["distopico", "ficcion politica"], "editor": {"nombre": "Secker & Warburg", "fecha": "1949-06-08 00:00:00"}}', '{"titulo": "Do Androids Dream of Electric Sheep?", "autor": "Phillip K. Dick", "pais": "Estados Unidos", "paginas": 210, "generos": ["ciencia ficcion", "ficcion filisofica"], "editor": {"nombre": "Doubleday", "fecha": "1968-00-00 00:00:00"}}', '{"titulo": "Snow Crash", "autor": "William Gibson", "pais": "Estados Unidos", "paginas": 271, "generos": ["ciencia ficcion"], "editor": {"nombre": "Ace", "fecha": "1984-07-01 00:00:00"}}']

    import json
    
    
    def dict_to_json(libro):
        return json.dumps(libro)
    
    
    biblioteca = [{
        'titulo': 'Nineteen Eighty-Four',
        'autor': 'George Orwell',
        'pais': 'Reino Unido',
        'paginas': 328,
        'generos': ['distopico', 'ficcion politica'],
        'editor': {
            'nombre': 'Secker & Warburg',
            'fecha': '1949-06-08 00:00:00'}
    }, {
        'titulo': 'Do Androids Dream of Electric Sheep?',
        'autor': 'Phillip K. Dick',
        'pais': 'Estados Unidos',
        'paginas': 210,
        'generos': ['ciencia ficcion', 'ficcion filosofica'],
        'editor': {'nombre': 'Doubleday', 'fecha': '1968-00-00 00:00:00'}
    }, {
        'titulo': 'Snow Crash',
        'autor': 'William Gibson',
        'pais': 'Estados Unidos',
        'paginas': 271,
        'generos': ['ciencia ficcion'],
        'editor': {'nombre': 'Ace', 'fecha': '1984-07-01 00:00:00'}
    }]
    
    json_libros = map(dict_to_json, biblioteca)
    print(list(json_libros))
  2. Con el siguiente archivo csv, escriba una función de mapa de Python que reemplace todas las instancias de "M" por "m" y todas las instancias de "F" por "f" y guarde el resultado en un nuevo archivo csv

    Entrada:

    id,nombre,nombre,city,state,zip,dob,gender
    382,John,Doe,New York City,New York,10003,1959/05/23,M
    121,Jane,Doe,Paris,France,75000,1964/03/03,F
    329,Jack,Doe,Tokyo,Japan,100-0004,1961/07/15,M
    119,James,Doe,Ulaanbaatar,Mongolia,14200,1999/08/15,M
    124,Jamie,Doe,Casablanca,Morocco,20000,2000/12/10,F

    Rendimiento esperado:

    id,nombre,nombre,city,state,zip,dob,gender
    382,John,Doe,New York City,New York,10003,1959/05/23,m
    121,Jane,Doe,Paris,France,75000,1964/03/03,f
    329,Jack,Doe,Tokyo,Japan,100-0004,1961/07/15,m
    119,James,Doe,Ulaanbaatar,Mongolia,14200,1999/08/15,m
    124,Jamie,Doe,Casablanca,Morocco,20000,2000/12/10,f

    import csv
    
    
    def registro_de_formato(registro):
        copy = registro.copy()
        copy['gender'] = copy['gender'].lower()
        return copy
    
    
    with open('input.csv', 'r', newline='') as datos:
        registros = []
        filas = datos.readlines()
        headers = [f.strip('\n\r') for f in filas[0].split(',')]
        for fila in filas[1:]:
            registro = {}
            for i, col in enumerate(fila.split(',')):
                registro[headers[i]] = col.rstrip('\n\r')
            registros.append(registro)
    
        with open('output.csv', mode='w') as csv_file:
            writer = csv.DictWriter(csv_file, fieldnames=registros[0].keys(), delimiter=',')
    
            writer.writeheader()
            formatted = list(map(registro_de_formato, registros))
            for registro in formatted:
                writer.writerow(registro)
  3. Escriba una función de filtro de Python que mantenga a todos los usuarios que viven en Nueva York de la siguiente lista de diccionarios

    Entrada:

    registros = [{
        'id': '1',
        'nombre': 'John Doe',
        'city': 'New York'
    }, {
        'id': '2',
        'nombre': 'Jane Doe',
        'city': 'New York'
    }, {
        'id': '3',
        'nombre': 'Jack Doe',
        'city': 'Florence'
    }, {
        'id': '4',
        'nombre': 'James Doe',
        'city': 'Hong Kong'
    }, {
        'id': '5',
        'nombre': 'Jamie Doe',
        'city': 'Sydney'
    }]

    Rendimiento esperado: [{'id': '1', 'nombre': 'John Doe', 'city': 'New York'}, {'id': '2', 'nombre': 'Jane Doe', 'city': 'New York'}]

    def es_residente_ny(registro):
        return registro['city'] == 'New York'
    
    
    registros = [{
        'id': '1',
        'nombre': 'John Doe',
        'city': 'New York'
    }, {
        'id': '2',
        'nombre': 'Jane Doe',
        'city': 'New York'
    }, {
        'id': '3',
        'nombre': 'Jack Doe',
        'city': 'Florence'
    }, {
        'id': '4',
        'nombre': 'James Doe',
        'city': 'Hong Kong'
    }, {
        'id': '5',
        'nombre': 'Jamie Doe',
        'city': 'Sydney'
    }]
    
    filtrada = list(filter(es_residente_ny, registros))
    print(filtrada)
  4. Escriba una función de filtro de Python que elimine los libros publicados antes de 1969 de la siguiente lista

    Entrada:

    biblioteca = [{
        'titulo': 'Nineteen Eighty-Four',
        'autor': 'George Orwell',
        'pais': 'Reino Unido',
        'paginas': 328,
        'generos': ['distopico', 'ficcion politica'],
        'editor': {
            'nombre': 'Secker & Warburg',
            'fecha': '1949-06-08 00:00:00'
        }
    }, {
        'titulo': 'Do Androids Dream of Electric Sheep?',
        'autor': 'Phillip K. Dick',
        'pais': 'Estados Unidos',
        'paginas': 210,
        'generos': ['ciencia ficcion', 'ficcion filosofica'],
        'editor': {'nombre': 'Doubleday', 'fecha': '1968-01-01 00:00:00'}
    }, {
        'titulo': 'Snow Crash',
        'autor': 'William Gibson',
        'pais': 'Estados Unidos',
        'paginas': 271,
        'generos': ['ciencia ficcion'],
        'editor': {'nombre': 'Ace', 'fecha': '1984-07-01 00:00:00'}
    }]

    Rendimiento esperado: [{'titulo': 'Nineteen Eighty-Four', 'autor': 'George Orwell', 'pais': 'Reino Unido', 'paginas': 328, 'generos': ['distopico', 'ficcion politica'], 'editor': {'nombre': 'Secker & Warburg', 'fecha': '1949-06-08 00:00:00'}}, {'titulo': 'Do Androids Dream of Electric Sheep?', 'autor': 'Phillip K. Dick', 'pais': 'Estados Unidos', 'paginas': 210, 'generos': ['ciencia ficcion', 'ficcion filosofica'], 'editor': {'nombre': 'Doubleday', 'fecha': '1968-01-01 00:00:00'}}]

    from datetime import datetime
    
    
    def es_antes_de_1969(libro):
        d = datetime.strptime(libro['editor']['fecha'], '%Y-%m-%d %H:%M:%S')
        return d.year < 1969
    
    
    biblioteca = [{
        'titulo': 'Nineteen Eighty-Four',
        'autor': 'George Orwell',
        'pais': 'Reino Unido',
        'paginas': 328,
        'generos': ['distopico', 'ficcion politica'],
        'editor': {
            'nombre': 'Secker & Warburg',
            'fecha': '1949-06-08 00:00:00'
        }
    }, {
        'titulo': 'Do Androids Dream of Electric Sheep?',
        'autor': 'Phillip K. Dick',
        'pais': 'Estados Unidos',
        'paginas': 210,
        'generos': ['ciencia ficcion', 'ficcion filosofica'],
        'editor': {'nombre': 'Doubleday', 'fecha': '1968-01-01 00:00:00'}
    }, {
        'titulo': 'Snow Crash',
        'autor': 'William Gibson',
        'pais': 'Estados Unidos',
        'paginas': 271,
        'generos': ['ciencia ficcion'],
        'editor': {'nombre': 'Ace', 'fecha': '1984-07-01 00:00:00'}
    }]
    
    filtrada = list(filter(es_antes_de_1969, biblioteca))
    print(filtrada)
  5. Escriba una función de filtro de Python que mantenga a todos los usuarios entre las edades de 18 a 35 del siguiente csv y guarde el resultado en un nuevo archivo csv

    Entrada:

    id,nombre,nombre,city,state,zip,age,gender
    382,John,Doe,New York City,New York,10003,54,M
    121,Jane,Doe,Paris,France,75000,48,F
    329,Jack,Doe,Tokyo,Japan,100-0004,10,M
    119,James,Doe,Ulaanbaatar,Mongolia,14200,25,M
    124,Jamie,Doe,Casablanca,Morocco,20000,20,F

    Rendimiento esperado:

    id,nombre,nombre,city,state,zip,age,gender
    id,nombre,nombre,city,state,zip,age,gender
    119,James,Doe,Ulaanbaatar,Mongolia,14200,25,M
    124,Jamie,Doe,Casablanca,Morocco,20000,20,F

    import csv
    
    
    def es_demografico(registro):
        age = int(registro['age'])
        return age >= 18 and age <= 35
    
    
    with open('input.csv', 'r', newline='') as datos:
        registros = []
        filas = datos.readlines()
        headers = [f.strip('\n\r') for f in filas[0].split(',')]
        for fila in filas[1:]:
            registro = {}
            for i, col in enumerate(fila.split(',')):
                registro[headers[i]] = col.rstrip('\n\r')
            registros.append(registro)
    
        with open('output.csv', mode='w') as csv_file:
            writer = csv.DictWriter(csv_file, nombre=registros[0].keys(), delimiter=',')
    
            writer.writeheader()
            formatted = list(filter(es_demografico, registros))
            for registro in formatted:
                writer.writerow(registro)

¿Quieres ver más ejercicios?

Ver Ejercicios

Commentarios

Debes iniciar sesión para comentar. ¿No tienes una cuenta? Registrate gratis.

Subscribe to comments for this post

Regístrese para recibir más contenido gratuito

¿Le gustaría recibir recursos gratuitos, diseñados para ayudarlo a alcanzar sus objetivos de TI? Empiece ahora y deje su dirección de correo electrónico a continuación. Prometemos no hacer spam. También puede registrarse para obtener una cuenta gratuita o seguirnos en e interactuar con la comunidad. Puede optar por no participar en cualquier momento.



Háblanos de tu Proyecto









Contacta Con Nosotras

¿Tiene un problema de TI específico que necesita solución o simplemente tiene una pregunta general de TI? Utilice el formulario de contacto para ponerse en contacto con nosotros y un profesional de TI estará con usted en un momento.

Contratanos

Ofrecemos desarrollo web, desarrollo de software empresarial, control de calidad y pruebas, google analytics, dominios y hosting, bases de datos, seguridad, consultoría de TI y otros servicios relacionados con TI.

Tutoriales de TI gratuitos

Dirígete a nuestra sección tutoriales para aprender todo sobre cómo trabajar con soluciones de TI.

Contacto