Wenn ich ein Wörterbuch wieWie man ein Wörterbuch in Julia umkehrt?
my_dict = Dict(
"A" => "one",
"B" => "two",
"C" => "three"
)
Was ist der beste Weg, um den Schlüssel/Wert-Mappings umzukehren?
Wenn ich ein Wörterbuch wieWie man ein Wörterbuch in Julia umkehrt?
my_dict = Dict(
"A" => "one",
"B" => "two",
"C" => "three"
)
Was ist der beste Weg, um den Schlüssel/Wert-Mappings umzukehren?
Eine Möglichkeit wäre es, ein Verständnis zu verwenden, durch Iteration über den Schlüssel/Wert-Paare das neue Wörterbuch zu bauen, so dass sie auf dem Weg Swapping:
julia> Dict(value => key for (key, value) in my_dict)
Dict{String,String} with 3 entries:
"two" => "B"
"one" => "A"
"three" => "C"
Wenn Schlüssel und Werte tauschen, Sie behalten möchten, können Bedenken Sie, dass, wenn my_dict
doppelte Werte hat (zB "A"
), das neue Wörterbuch möglicherweise weniger Schlüssel hat. Außerdem ist der Wert, der mit dem Schlüssel "A"
in dem neuen Wörterbuch gefunden wird, möglicherweise nicht der, den Sie erwarten (die Wörterbücher von Julia speichern ihre Inhalte nicht in einer leicht bestimmten Reihenfolge).
Angenommen, Sie müssen sich keine Sorgen über wiederholte Werte als Schlüssel zu kollidieren, Sie map
verwenden könnte mit reverse
:
julia> my_dict = Dict("A" => "one", "B" => "two", "C" => "three")
Dict{String,String} with 3 entries:
"B" => "two"
"A" => "one"
"C" => "three"
julia> map(reverse, my_dict)
Dict{String,String} with 3 entries:
"two" => "B"
"one" => "A"
"three" => "C"
Das ist die beste Antwort! –
dies vor einiger Zeit für Wörterbücher gemacht, die
function invert_dict(dict, warning::Bool = false)
vals = collect(values(dict))
dict_length = length(unique(vals))
if dict_length < length(dict)
if warning
warn("Keys/Vals are not one-to-one")
end
linked_list = Array[]
for i in vals
push!(linked_list,[])
end
new_dict = Dict(zip(vals, linked_list))
for (key,val) in dict
push!(new_dict[val],key)
end
else
key = collect(keys(dict))
counter = 0
for (k,v) in dict
counter += 1
vals[counter] = v
key[counter] = k
end
new_dict = Dict(zip(vals, key))
end
return new_dict
end
kollidierende Werte haben
Verwenden Sie dies, wenn ein Schlüssel doppelt vorhanden ist, haben Sie eine Liste mit allen Werten, so dass keine Daten verloren gehen, dh
julia> a = [1,2,3]
julia> b = ["a", "b", "b"]
julia> Dict(zip(a,b))
Dict{Int64,String} with 3 entries:
2 => "b"
3 => "b"
1 => "a"
julia> invert_dict(ans)
Dict{String,Array} with 2 entries:
"b" => Any[2,3]
"a" => Any[1]
Müssen Sie sich Sorgen machen, dass zwei verschiedene Tasten auf denselben Wert abgebildet werden oder nicht? – DSM