Diferencia de Conjuntos con programación funcional de Python

Supongamos que tenemos dos listas a y b de Python y queremos calcular una lista d tal que:

d = a – b #diferencia de conjuntos.

Utilizando las construcciones funcionales de Python (en particular List Comprehension), resulta muy sencillo:

d = [x for x in a if x not in b]

Vean como la construcción del lenguaje prácticamente se lee como la definición formal de diferencia de conjuntos: “d es igual a x para todo x que pertenece a a y x no pertenece a b“.

Si comparamos esto con el equivalente imperativo, es fácil ver que estamos expresando mediante el lenguaje lo que queremos que se haga y no cómo hacerlo exactamente.

Esta sutileza nos permite ahorrar mucho código y ser más productivos desarrollando aplicaciones cuando no es crítico el mantener el control sobre cada instrucción exacta a ser ejecutada.

¿Qué otros ejemplos interesantes de manejo de listas sueles utilizar?

This entry was posted in Programacion, Python. Bookmark the permalink.

2 Responses to Diferencia de Conjuntos con programación funcional de Python

  1. Bruno says:

    En el UML Almighty seria algo asi:
    d := a difference: b.

    Si vas al metodo #difference: de la clase Collection.
    difference: comperand

    ^self reject: [:each | comperand includes: each]

    “Devuelve una nueva coleccion que rechaza los elementos de la coleccion actual que tambien estan en la coleccion ”

    En el UML Almighty #reject: (lo mismo para #select:) es una primitiva, pero se puede poner como codigo (pero es menos performante).

    select: discriminatorBlock
    | newCollection |
    newCollection := self newSpecie.
    self do: [:each | (discriminatorBlock value: each) ifTrue: [newCollection add: each]].
    ^newCollection

    Aqui nuevamente se llama al metodo #do:, que es parecido al “for each”, digo parecido pq el uso de Bloques lo cambia todo.
    Bloque es algo asi (3 bloques):

    [:eachCliente | eachCliente valorTotalCompras >= 150000].

    [:eachNumero | eachNumero * 2].

    [:eachCliente |
    eachCliente actualizarSaldo: Date today.
    eachCliente calcularNuevoPorcentajeDeDescuentos].

    Saludos,
    Bruno

  2. Bruno says:

    Debio decir:

    ^self reject: [:each | comperand includes: each]

    “Devuelve una nueva coleccion que rechaza los elementos de la coleccion actual [self] que tambien estan en la coleccion [comperand]”

Comments are closed.