Diccionarios y conjuntos en Julia

En los capítulos anteriores aprendimosArreglos en Juliaytuplas en Julia。

Un arreglo es un tipo de colección; además, Julia tiene otros tipos de colecciones, como diccionarios y sets (colecciones no ordenadas).


Diccionario

Un diccionario es un modelo de contenedor mutable que puede almacenar objetos de cualquier tipo.

Cada par clave-valor del diccionariokey=>valuese separa con dos puntos=>, entre cada par clave-valor se usa una coma,; todo el diccionario se incluye entre llaves{}con el siguiente formato:

Crear un diccionario

La sintaxis para crear un diccionario es la siguiente:
Dict("key1" => value1, "key2" => value2,,…, "keyn" => valuen)

El siguiente ejemplo crea un diccionario simple: la clave A corresponde al valor 1, y la clave B corresponde al valor 2:

Dict("A"=>1, "B"=>2)

Ejemplo

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia>

Usar for para crear un diccionario:

Ejemplo

julia> first_dict = Dict(string(x) => sind(x) for x = 0:5:360)
Dict{String, Float64} with 73 entries:
  "285" => -0.965926
  "310" => -0.766044
  "245" => -0.906308
  "320" => -0.642788
  "350" => -0.173648
  "20"  => 0.34202
  "65"  => 0.906308
  "325" => -0.573576
  "155" => 0.422618
  "80"  => 0.984808
  "335" => -0.422618
  "125" => 0.819152
  "360" => 0.0
  "75"  => 0.965926
  "110" => 0.939693
  "185" => -0.0871557
  "70"  => 0.939693
  "50"  => 0.766044
  "190" => -0.173648
  ⋮     => ⋮

Clave (Key)

Las claves en un diccionario son únicas. Si asignamos un valor a una clave existente, no creamos una nueva, sino que modificamos la clave existente.

Buscar una clave (key)

Podemos usar la función haskey() para comprobar si el diccionario contiene la clave (key) especificada:

Ejemplo

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> haskey(first_dict, "A")
false

julia> haskey(D, "A")
true

julia> haskey(D, "Z")
false

También se puede usarin()la función para comprobar si el diccionario contieneclave/valorpar:

Ejemplo

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> in(("A" => 1), D)
true

julia> in(("X" => 220), first_dict)
false

Agregar un par key/value

Podemos agregar un nuevo par key/value a un diccionario existente, de la siguiente manera:

Ejemplo

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> D["C"] = 3
3

julia> D
Dict{String, Int64} with 3 entries:
  "B" => 2
  "A" => 1
  "C" => 3

Eliminar un par key/value

Podemos usardelete!()la función para eliminar la clave (key) de un diccionario existente:

Ejemplo

julia> delete!(D, "C")
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

Obtener todas las claves (keys) del diccionario

Podemos usarkeys()la función para obtener todas las claves (keys) del diccionario:

Ejemplo

julia> keys(D)
KeySet for a Dict{String, Int64} with 2 entries. Keys:
  "B"
  "A"

julia>

Valor (Value)

Cada clave en un diccionario tiene un valor correspondiente.

Ver todos los valores del diccionario

Podemos usarvalues()para ver todos los valores del diccionario:

Ejemplo

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> values(D)
ValueIterator for a Dict{String, Int64} with 2 entries. Values:
  2
  1

julia>

El diccionario como objeto iterable

Podemos tratar el diccionario como un objeto iterable para ver los pares clave/valor:

Ejemplo

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> for kv in D
         println(kv)
       end  
"B" => 2
"A" => 1

En el ejemplo,kves una tupla que contiene cada par clave/valor.

Ordenación de diccionarios

Los diccionarios son desordenados, pero podemos usar la función sort() para ordenarlos:

Ejemplo

julia> ejemplo_dict = Dict("R" => 100, "S" => 220, "T" => 350, "U" => 400, "V" => 575, "W" => 670)
Dict{String, Int64} with 6 entries:
  "S" => 220
  "U" => 400
  "T" => 350
  "W" => 670
  "V" => 575
  "R" => 100

julia> for key in sort(collect(keys(ejemplo_dict)))
         println("$key => $(ejemplo_dict[key])")
       end
R => 100
S => 220
T => 350
U => 400
V => 575
W => 670

Podemos usar el tipo de datos SortedDict del paquete DataStructures.ji para mantener el diccionario siempre ordenado.

Para usar el paquete DataStructures primero hay que instalarlo; se puede agregar SortedDict con el comando add en el modo Pkg del REPL.

En el REPL, ingrese el símbolo], para entrar alpkgmodo.

Entrar al modo pkg

julia> ]               # Ingrese ] para entrar al modo pkg

Formato de sintaxis para agregar un paquete:

add 包名

A continuación, después de agregar el paquete DataStructures, los ejemplos posteriores podrán ejecutarse correctamente:

(@v1.7) pkg> add DataStructures
Para paquetes no registrados, se puede especificar directamente la URL:
add https://github.com/fredrikekre/ImportMacros.jl

Paquete local:

add 本地路径/包名.jl

Ejemplo

julia> import DataStructures

julia> ejemplo_dict = DataStructures.SortedDict("S" => 220, "T" => 350, "U" => 400, "V" => 575, "W" => 670)
DataStructures.SortedDict{String, Int64, Base.Order.ForwardOrdering} with 5 entries:
  "S" => 220
  "T" => 350
  "U" => 400
  "V" => 575
  "W" => 670

julia> ejemplo_dict["R"] = 100
100

julia> ejemplo_dict
DataStructures.SortedDict{String, Int64, Base.Order.ForwardOrdering} with 6 entries:
  "R" => 100
  "S" => 220
  "T" => 350
  "U" => 400
  "V" => 575
  "W" => 670

Set (conjunto)

El Set (conjunto) de Julia es un conjunto de datos de objetos sin repetición; todos los elementos son únicos.

Las diferencias entre un set y otros tipos de colecciones son:

  • Los elementos de un set son únicos.
  • El orden de los elementos en un set no es importante.

Un set se usa para crear listas sin duplicados.

Crear un conjunto Set

Con el constructor Set, podemos crear conjuntos como los siguientes:

Ejemplo

julia> var_site = Set()
Set{Any}()

julia> num_primes = Set{Int64}()
Set{Int64}()

julia> var_site = Set{String}(["Google","Ejemplo","Taobao"])
Set{String} with 3 elements:
  "Google"
  "Taobao"
  "Ejemplo"
Alternatively we can also use push!() function, as arrays, to add elements in sets as follows −

Podemos usarpush!()la función para agregar elementos al conjunto, de la siguiente manera:

Ejemplo

julia> push!(var_site, "Wiki")
Set{String} with 4 elements:
  "Google"
  "Wiki"
  "Taobao"
  "Ejemplo"

Podemos usarin()la función para comprobar si un elemento existe en el conjunto:

Ejemplo

julia> in("Ejemplo", var_site)
true

julia> in("Zhihu", var_site)
false

Operaciones comunes

La unión, intersección y diferencia son operaciones comunes que podemos realizar sobre conjuntos; las funciones correspondientes sonunion()、intersect()ysetdiff()。

Unión

Dados dos conjuntos A y B, el conjunto formado por todos sus elementos combinados se llama unión de A y B.

Ejemplo

julia> A = Set{String}(["red","green","blue", "black"])
Set{String} with 4 elements:
  "blue"
  "green"
  "black"
  "red"

julia> B = Set(["red","orange","yellow","green","blue","indigo","violet"])
Set{String} with 7 elements:
  "indigo"
  "yellow"
  "orange"
  "blue"
  "violet"
  "green"
  "red"


julia> union(A, B)
Set{String} with 8 elements:
  "indigo"
  "green"
  "black"
  "yellow"
  "orange"
  "blue"
  "violet"
  "red"

Intersección

La intersección de A y B es el conjunto que contiene todos los elementos que pertenecen tanto a A como a B, y ningún otro elemento.

Ejemplo

julia> intersect(A, B)
Set{String} with 3 elements:
  "blue"
  "green"
  "red"

Diferencia

La diferencia de A y B es el conjunto que contiene todos los elementos que pertenecen a A pero no a B, es decir, elimina los elementos que se superponen entre B y A.

Ejemplo

julia> setdiff(A, B)
Set{String} with 1 element:
  "black"

Ejemplos de funciones comunes para diccionarios y conjuntos

En los siguientes ejemplos se muestran funciones de uso común en diccionarios, que también se aplican a los conjuntos:

Crear dos diccionarios dict1 y dict2:

Ejemplo

julia> dict1 = Dict(100=>"X", 220 => "Y")
Dict{Int64,String} with 2 entries:
 100 => "X"
 220 => "Y"
 
julia> dict2 = Dict(220 => "Y", 300 => "Z", 450 => "W")
Dict{Int64,String} with 3 entries:
 450 => "W"
 220 => "Y"
 300 => "Z"

Unión de diccionarios:

Ejemplo

julia> union(dict1, dict2)
4-element Array{Pair{Int64,String},1}:
 100 => "X"
 220 => "Y"
 450 => "W"
 300 => "Z"
Intersect
julia> intersect(dict1, dict2)
1-element Array{Pair{Int64,String},1}:
 220 => "Y"

Diferencia de diccionarios:

Ejemplo

julia> setdiff(dict1, dict2)
1-element Array{Pair{Int64,String},1}:
 100 => "X"

Combinar diccionarios:

Ejemplo

julia> merge(dict1, dict2)
Dict{Int64,String} with 4 entries:
 100 => "X"
 450 => "W"
 220 => "Y"
 300 => "Z"

Ver el valor mínimo en el diccionario:

Ejemplo

julia> dict1
Dict{Int64,String} with 2 entries:
 100 => "X"
 220 => "Y"
 
 
julia> findmin(dict1)
("X", 100)
Otras extensiones