Teoría de conjuntos

Cómo escribir código Python eficiente

Logan Thomas

Scientific Software Technical Trainer, Enthought

Teoría de conjuntos

  • Rama de las matemáticas aplicada a colecciones de objetos
    • p. ej., sets
  • Python tiene el tipo set con métodos:
    • intersection(): elementos en ambos conjuntos
    • difference(): elementos en uno pero no en el otro
    • symmetric_difference(): elementos en exactamente uno
    • union(): elementos en cualquiera de los dos
  • Comprobación rápida de pertenencia
    • Ver si un valor existe en una secuencia
    • Usando el operador in
Cómo escribir código Python eficiente

Comparar objetos con bucles

list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle']

alt=”Los Pokémon Bulbasaur, Charmander y Squirtle en una caja titulada Lista A y los Pokémon Caterpie, Pidgey y Squirtle en otra caja titulada Lista B”

Cómo escribir código Python eficiente

Comparar objetos con bucles

list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle'] 

alt=”Los Pokémon Bulbasaur, Charmander y Squirtle en una caja titulada Lista A y los Pokémon Caterpie, Pidgey y Squirtle en otra caja titulada Lista B; Squirtle está rodeado en ambas cajas”

Cómo escribir código Python eficiente
list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle'] 
in_common = []

for pokemon_a in list_a:
    for pokemon_b in list_b:
        if pokemon_a == pokemon_b:
            in_common.append(pokemon_a)

print(in_common)
['Squirtle']
Cómo escribir código Python eficiente
list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle'] 
set_a = set(list_a)
print(set_a)
{'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = set(list_b)
print(set_b)
{'Caterpie', 'Pidgey', 'Squirtle'}
set_a.intersection(set_b)
{'Squirtle'}
Cómo escribir código Python eficiente

Eficiencia con teoría de conjuntos

%%timeit
in_common = []

for pokemon_a in list_a:
    for pokemon_b in list_b:
        if pokemon_a == pokemon_b:
            in_common.append(pokemon_a)
601 ns ± 17.1 ns por bucle (media ± desv. típ. de 7 ejec., 1000000 bucles cada una)
%timeit in_common = set_a.intersection(set_b)
137 ns ± 3.01 ns por bucle (media ± desv. típ. de 7 ejec., 10000000 bucles cada una)
Cómo escribir código Python eficiente

Método de conjuntos: difference

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.difference(set_b)
{'Bulbasaur', 'Charmander'}

alt=”Los Pokémon Bulbasaur, Charmander y Squirtle en una caja titulada Conjunto A y los Pokémon Caterpie, Pidgey y Squirtle en otra caja titulada Conjunto B; Bulbasaur y Charmander están rodeados en el Conjunto A”

Cómo escribir código Python eficiente

Método de conjuntos: difference

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_b.difference(set_a)
{'Caterpie', 'Pidgey'}

alt=”Los Pokémon Bulbasaur, Charmander y Squirtle en una caja titulada Conjunto A y los Pokémon Caterpie, Pidgey y Squirtle en otra caja titulada Conjunto B; Caterpie y Pidgey están rodeados en el Conjunto B”

Cómo escribir código Python eficiente

Método de conjuntos: symmetric_difference

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.symmetric_difference(set_b)
{'Bulbasaur', 'Caterpie', 'Charmander', 'Pidgey'}

alt=”Los Pokémon Bulbasaur, Charmander y Squirtle en una caja titulada Conjunto A y los Pokémon Caterpie, Pidgey y Squirtle en otra caja titulada Conjunto B; Bulbasaur, Charmander, Caterpie y Pidgey están rodeados”

Cómo escribir código Python eficiente

Método de conjuntos: union

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.union(set_b)
{'Bulbasaur', 'Caterpie', 'Charmander', 'Pidgey', 'Squirtle'}

alt=”Los Pokémon Bulbasaur, Charmander y Squirtle en una caja titulada Conjunto A y los Pokémon Caterpie, Pidgey y Squirtle en otra caja titulada Conjunto B; todos los Pokémon están rodeados y Squirtle solo una vez”

Cómo escribir código Python eficiente

Pruebas de pertenencia con conjuntos

# Los mismos 720 Pokémon en cada estructura
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}

alt=”Los Pokémon Abomasnow, Abra y Absol en tres cajas separadas tituladas Lista, Tupla y Conjunto, respectivamente”

Cómo escribir código Python eficiente

Pruebas de pertenencia con conjuntos

# Los mismos 720 Pokémon en cada estructura
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}

alt=”Los Pokémon Abomasnow, Abra y Absol en tres cajas separadas tituladas Lista, Tupla y Conjunto; el Pokémon Zubat con una línea a cada caja representando una prueba de pertenencia”

Cómo escribir código Python eficiente
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}
%timeit 'Zubat' en names_list
7.63 µs ± 211 ns por bucle (media ± desv. típ. de 7 ejec., 100000 bucles cada una)
%timeit 'Zubat' en names_tuple
7.6 µs ± 394 ns por bucle (media ± desv. típ. de 7 ejec., 100000 bucles cada una)
%timeit 'Zubat' en names_set
37.5 ns ± 1.37 ns por bucle (media ± desv. típ. de 7 ejec., 10000000 bucles cada una)
Cómo escribir código Python eficiente

Únicos con conjuntos

# 720 tipos primarios de Pokémon correspondientes a cada Pokémon
primary_types = ['Grass', 'Psychic', 'Dark', 'Bug', ...]
unique_types = []

for prim_type in primary_types:
    if prim_type not in unique_types:
        unique_types.append(prim_type)

print(unique_types)
['Grass', 'Psychic', 'Dark', 'Bug', 'Steel', 'Rock', 'Normal',
 'Water', 'Dragon', 'Electric', 'Poison', 'Fire', 'Fairy', 'Ice',
 'Ground', 'Ghost', 'Fighting', 'Flying']
Cómo escribir código Python eficiente

Únicos con conjuntos

# 720 tipos primarios de Pokémon correspondientes a cada Pokémon
primary_types = ['Grass', 'Psychic', 'Dark', 'Bug', ...]
unique_types_set = set(primary_types)
print(unique_types_set)
{'Grass', 'Psychic', 'Dark', 'Bug', 'Steel', 'Rock', 'Normal',
 'Water', 'Dragon', 'Electric', 'Poison', 'Fire', 'Fairy', 'Ice',
 'Ground', 'Ghost', 'Fighting', 'Flying'}
Cómo escribir código Python eficiente

¡Vamos a practicar la teoría de conjuntos!

Cómo escribir código Python eficiente

Preparing Video For Download...