8
votes

Inverser un hachage avec des valeurs de tableau

Pour faciliter la création, j'écris mon hasch comme ceci: xxx

mais partout je l'utilise, je dois rechercher la clé associée à une valeur. Actuellement je fais ce qui suit pour le transformer: xxx

qui me donne ce que je veux: xxx

mais est Il existe un moyen plus simple d'atteindre le même objectif?


0 commentaires

3 Réponses :


2
votes

J'essayais de faire exactement cela hier. C'était ma solution:

h = {
key1: [:val1, :val2, :val3],    
key2: [:val4, :val5, :val6],    
}  
=> {:key1=>[:val1, :val2, :val3], :key2=>[:val4, :val5, :val6]}

hp = {}
=> {}

h.each { |k, v| v.each{ |e| hp[e] = k } }
=> {:key1=>[:val1, :val2, :val3], :key2=>[:val4, :val5, :val6]}

hp
=> {:val1=>:key1,
:val2=>:key1,
:val3=>:key1,
:val4=>:key2,
:val5=>:key2,
:val6=>:key2}


0 commentaires

3
votes
h = {
    :key1 => [:val1, :val2, :val3],
    :key2 => [:val4, :val5, :val6]
}

p Hash[h.flat_map{|k,v| v.zip [k]*v.size }]
# >> {:val1=>:key1, :val2=>:key1, :val3=>:key1, :val4=>:key2, :val5=>:key2, :val6=>:key2}
p Hash[h.flat_map{|k,v| v.zip [k].cycle }]
# >> {:val1=>:key1, :val2=>:key1, :val3=>:key1, :val4=>:key2, :val5=>:key2, :val6=>:key2}

3 commentaires

Je pense que le code est difficile à lire (donc difficile à entretenir pour les systèmes de production). Mais c'est cool et court :) (+1)


Très cool. v.zip ([k] * v.size) pourrait être simplifié à v.zip ([k] .cycle) .


@undur_gongor Nice UseCase J'ai vu aujourd'hui pour #cycle . Merci beaucoup.



10
votes

Array # Le produit est assez badass pour cela. :) xxx


1 commentaires

Je pense que c'est une solution lisible et efficace par rapport à d'autres