2016-11-19 4 views
7

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?

+0

Müssen Sie sich Sorgen machen, dass zwei verschiedene Tasten auf denselben Wert abgebildet werden oder nicht? – DSM

Antwort

11

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).

14

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" 
+0

Das ist die beste Antwort! –

4

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]