Transformar cada elemento de la lista

En esta página, utilizarás el bloque mapear para crear un bloque iniciales del nombre y luego usarás mapear junto con iniciales del nombre para encontrar las iniciales de todos tus contactos.

Morgan, Jasmine y Omar están creando un bloque iniciales del nombre que acepta un contacto como entrada y reporta las iniciales de esa persona.
iniciales del nombre (nombre del contacto ((elemento (1) de (lista de contactos)) reporta 'BA'
Jasmine: usé el bloque dividir () por ('punto rosa que indica un carácter de espacio') para dividir el nombre completo del contacto en una lista de sus nombres, y luego uní la primera letra de cada nombre:
iniciales del contacto: (contacto) {
    variables de programa (lista de nombres)
    establecer (lista de nombres) en (dividir (nombre de contacto (contacto)) por (palabra))
    reporta (unir (letra (1) de (elemento(1) de (lista de nombres))) (letra (1) de (elemento(2) de (lista de nombres))))
}
¿Cuál es la diferencia entre dividir por espacios y dividir por palabras?

¡Inténtalo! (Cada punto rosa representa un espacio).
separar "hola␠␠␠␠␠␠␠mundo" por (␠) separar "hola␠␠␠␠␠␠␠mundo" por palabra

En un caso, dividir se centra en los caracteres exactos de la cadena. En el otro caso, te está dando lo que realmente quieres: las palabras en el nombre del contacto. En un nivel inferior de abstracción, el texto está hecho de caracteres y miras a través de cada uno de los caracteres. Pero en un nivel superior de abstracción (como cuando estás leyendo), el texto se compone de palabras. Snap! te permite pensar en este nivel superior de abstracción.

Morgan: Pero, ¿qué pasa con alguien que tiene tres nombres como Martin Luther King? Solo reportaría "ML" para él.
Omar: Ah, eso es porque el bloque solo toma la primera letra de los elementos 1 y 2. Tenemos que agregar letra (1) de (elemento (3) de (lista de nombres)).
Jasmine: Pero, ¿y si alguien tiene aún más nombres? En la familia de mi tía cada uno tiene cinco o seis nombres...
Omar: Bueno, entonces necesitamos tomar letra (1) de cada elemento en la lista de nombres. Eso suena como si lo que necesitáramos fuera una función de orden superior. Las funciones de orden superior son buenas para hacer cosas con elementos individuales de una lista.

Una función de orden superior (higher-order function) es una función que toma una función como entrada (o reporta una función como salida).

  1. Crea y experimenta con estos ejemplos de la función mapear.
    mapear (unir( )(s)) sobre (lista{bloque, programa, Booleana})
    mapear ((3) * ( )) sobre (lista{7, 8, 1})
    mapear (letra (1) de ( )) sobre (lista{rebotar, unir, limpiar})
  2. Habla con tu compañero Discute y luego explica por escrito qué significan estas expresiones.

El bloque asignar 'ranura de entrada de reportero' sobre 'ranura de entrada de lista' toma dos entradas: una función (un reportero con un espacio de entrada en blanco) y una lista, y reporta una nueva lista en la que cada elemento es el resultado de llamar a la función con un elemento de la lista original como entrada. Por ejemplo:
mapear(unir( )(s)) sobre (enumerar {gato, perro, pájaro}) reportar {gatos, perros, pájaros}
mapear(redondeado ( )) sobre (lista{3.14159, 87, 5.4}) reportar {3, 87, 5}

Tú eliges la función que describe el resultado de un elemento de entrada y mapear aplica esa función a cada elemento en la lista de entrada y luego reporta la lista de valores de resultado. Si tu función tiene elemento 1 de o elemento 2 de en ella, probablemente esté tratando de hacer la parte del trabajo de mapear. 

mapear es una función de orden superior al igual que mantener y combinar. La función mapeada sobre la lista siempre tiene una ranura de entrada en blanco. Aquí es donde va el elemento de la lista cada vez que se realiza la función.

Esta imagen muestra cómo se podrían usar las tres funciones de orden superior:
imagen del mapear transformando cada elemento, mantener bloqueando algunos elementos de entrada para que no aparezcan en el resultado y combinar superponiéndolos en un icono
Observa las expresiones de funciones de orden superior con estos procedimientos de formas (imaginarias).

mapear (sombrear figura ()) sobre (lista de figuras) mantener elementos (¿es () un polígono?) sobre (lista de figuras) combinar (lista de figuras) usando (superposición ())

Aquí hay una revisión rápida de las funciones de orden superior mapear, mantener y combinar.

  • Mapear realiza una función en cada elemento de una lista y reporta la lista de elementos modificados.
    mapear(( )-(1)) sobre (lista (96) (-100) (4.7)) reporta 95, -101, 3.7
  • Mantener usa una función de predicado (una pregunta de verdadero/falso) para verificar cada elemento en una lista y reporta los elementos que hacen que el predicado sea verdadero. (Aprendiste sobre mantener en Unidad 2 Laboratorio 3, Página 5: Mantener elementos de una lista).
    mantener (elementos (letra última de () igual a h) de lista (día, jefe, polilla, caja, mariposa, cepillo, camello, mosca, mito, cerrojo))
  • Combinar usa una función de combinación (una función con dos entradas) para reportar los resultados de combinar todos los elementos en una lista que usen esa función. (Aprendiste sobre combinar en Unidad 2 Laboratorio 4, Página 3: Más reporteros matemáticos.)
    combinar (lista {0, 1, 2}) con(()+()) reportar 3

  1. Si aún no está abierto, abre tu proyecto U3L2-ListaDeContactos.
  2. Usa mapear y combinar juntos para crear un reportero de iniciales del nombre que toma un nombre como entrada y reporte las iniciales de esa persona.
    iniciales del nombre (nombre del contacto ((elemento (1) de (lista de contactos)) reporta 'BA' iniciales del nombre (Martin Luther King) reporta 'MLK'
  3. Prueba y depura tu bloque iniciales del nombre.
  4. Crea una expresión para reportar una lista de las iniciales de todos tus contactos.
    ¿Necesitas una pista sobre cómo reportar las iniciales de todas las personas de tu lista de contactos?

    Primero, crea una expresión para reportar una lista de los nombres de todos tus contactos.
    observador de la lista de contactos en la vista de lista lista en vista de lista que contiene tres elementos: Betsy Anderson, Morgan Preston, Omar Hernandez

    observador de la lista de contactos en la vista de lista lista en la vista de lista que contiene tres elementos: BA, AP, GA
  5. ¿Cuáles de las siguientes afirmaciones son verdaderas acerca de esta lista?
    asignar a (números y palabras) el valor {conejo, 5, beneficio, es, 34, papalote, 2, 305, el, 61}
    mapear (letra (1) de ()) sobre (números y palabras) reporta la lista {r, 5, b, i, 3, k, 2, 3, t, 6}.
    mapear (elemento (1) de ()) sobre (palabras y números) reporta la lista {conejo}.
    Las dos anteriores.
    Ninguna de las anteriores.
  6. ¿Cuáles de las siguientes afirmaciones son verdaderas acerca de esta lista?
    asignar a (capitales) el valor {{Augusta, Maine}, {Boise, Idaho}, {Columbia, Carolina del Sur}, {Des Moines, Iowa}}
    Elige todos los que correspondan.
    ¿Por qué no usar un tipo de datos abstractos?

    La lista dentro de una lista que se muestra arriba deja más claro ahora que responde a este elemento de autocomprobación cuál es la estructura, pero tienes razón, en un programa real sería mejor usar un tipo de dato abstracto:
    estado: (Augusta) capital: (Maine)

    mapear (elemento (1) de ()) sobre (capitales) reporta la lista {Augusta, Boise, Columbia, Des Moines}.
    mapear (elemento (1) de ()) sobre (capitales) reporta la lista {Augusta, Maine}.
    mapear (letra (1) de ()) sobre (capitales) reporta la lista {A, B, C, D}.
    mapear (todos menos el primero de ()) sobre (capitales) reporta la lista {Maine, Idaho, Carolina del Sur, Iowa}.
    mapear (todos menos el primero de ()) sobre (capitales) reporta la lista {{Boise, Idaho}, {Columbia, Carolina del Sur}, {Des Moines, Iowa}}.
  7. Lee los dos guiones a continuación; ambos realizan la misma función. Escribe tus pensamientos Da dos razones por las que se prefiere el uso de la abstracción en el segundo ejemplo.
    variables de programa (nombres de contactos)
                    asignar a (nombres de contactos) el valor de (lista)
                    para cada (contacto) de (lista de contactos) {
                    añadir (nombre de contacto: (contacto)) a (nombres de contactos)
                    }
                    reporta (nombres de contactos) mapear (nombre del contacto: ()) sobre (lista de contactos)
  8. This new multiple-choice quizlet misbehaves if you only select some of the correct responses. Need to fix. --MF, 1/13/21

    Considera esta lista de cuadrados:
    asignar a (cuadrados) el valor {1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225}
    ¿Cuál de las siguientes expresiones reportará una lista? Elige todas las que correspondan.

    mapear (raíz cuadrada de ()) sobre (cuadrados)
    mantener los elementos donde (() módulo (2) = 0) de (cuadrados)
    combinar los elementos de (cuadrados) con (unir)
    mantener elementos donde (letra (longitud de ()) de () = 1) de (cuadrados)
    combinar los elementos de (cuadrados) con (+)
    mapear ((0)-()) sobre (cuadrados)
  1. Haz clic en la imagen para cargar este proyecto de base de datos:
    Datos obtenidos de Estructura e interpretación de programas informáticos de Abelson y Sussman. Licencia Creative Commons.
    bloque de lista que contiene nueve instancias del constructor 'empleado, nombre: () puesto: () salario: ()' cada uno con varias entradas
    Esta es la lista de empleados de una pequeña empresa. Cada una de las listas más pequeñas contiene el nombre de una persona, el puesto y el salario anual.

    "Esta empresa gasta más dinero en los grandes jefes que en las personas que hacen el trabajo", dice Alyssa. ¿Tiene razón? Escribe una expresión para calcular los salarios totales de todos los que cobran menos de 100,000 dólares al año. Luego encuentra el total de todos los que cobraron más de 100,000 dólares al año.

  2. Ben sugiere que los resultados serán más convincentes en forma de una lista que contenga ese total y todos los nombres de las personas en esa categoría (que cobren menos de 100,000 dólares, por ejemplo). Entonces, si hay cinco personas en esa categoría, tu lista tendrá seis elementos: primero el total de los salarios y luego los nombres de las personas. Prueba esto tanto para los que cobran menos de 100,000 dólares como para más de 100,000 dólares.
  3. Encuentra el salario promedio de las personas que cobran menos de 100,000 dólares al año.