Renverser une table de hachage en Ruby
Comment inverser les éléments dans la table de hachage, en gardant les mêmes valeurs et les touches, mais en inversant leur ordre dans la table de hachage.
Comme suit:
{ "4" => "happiness", "10" => "cool", "lala" => "54", "1" => "spider" }
Et convertir:
{ "1" => "spider", "lala" => "54", "10" => "cool", "4" => "happiness" }
Ou, je pourrais peut-être lancer un each
boucle vers l'arrière, en commençant par le dernier élément dans la table de hachage, plutôt que le premier?
- À ne pas confondre avec l'inversion d'une table de hachage (commutation clés avec des valeurs). ruby-doc.org/core-2.0/Hash.html#method-i-invert
Vous devez vous connecter pour publier un commentaire.
Vous pouvez convertir la valeur de Hachage à un Tableau, à l'inverse, et puis le reconvertir en un Hachage:
Hash#to_a
vous donne un tableau de tableaux, à l'intérieur des tableaux sont simples[key,value]
paires, puis vous revenir sur ce tableau à l'aide deArray#inverse
, etHash[]
convertit le[key,value]
paires de retour dans une table de Hachage.Ruby 2.1 ajoute un
Array#to_h
méthode de sorte que vous pouvez dire maintenant:{"happiness"=>"4", "cool"=>"10", "54"=>"lala", "spider"=>"1"}
Hash[h.to_a.map {|x| x=x.reverse}]
h.to_a.reverse.to_h
.En Ruby 2.1+ vous pouvez combiner
reverse_each
etto_h
:reverse
serait de produire. [Tableau#to_h](ruby-doc.org/core-2.2.3/Array.html#method-i-to_h est venu avec v 2.1, mais Énumérable#reverse_each a été autour depuis au moins v1.9.3. Sinon,h.reverse_each.with_object({}) } |(k,v),g| g[k]=v }
.Mais cela laisse un mauvais goût (tout comme les autres réponses, qui fonctionnent très bien tout comme celui-ci). Si vous avez pour ce faire, il pourrait être une indication qu'un Hash n'était pas le meilleur choix.
Hash[h.map { |k, v| [v, k] }]
ouHash[h.map(&:reverse)]
alors?Dans le plus pur ruby, vous pouvez le faire par
hash.map(&:reverse).to_h
ouhash.reverse_each.to_h
Dans les rails, vous pouvez le faire par
hash.invert
Alternativement, vous pouvez utiliser
reduce
etmerge
pour ajouter l'élément à l'avant d'une nouvelle table de hachage:mais, c'est fou 😀
Dans Ruby 1.8.7, l'ordre des éléments dans une table de hachage est documenté pour ne pas être sous notre contrôle, aucune des méthodes ci-dessus fonctionne. Dans Ruby 1.9.3, les choses fonctionnent et sont documentées dans la façon dont les autres réponses se fier.
Le Ruby 1.8.7 chemin était bien ancrée solidement pour moi que j'ai mal compris la question pendant un bon moment. J'ai pensé qu'il a demandé un moyen de Dièse#inverser: c'est à dire de transformer la valeur de hachage telle que la gamme des cartes pour le domaine. Cette méthode entraîne la suppression des doublons. Luís Ramalho offre une méthode qui ne l'est pas, mais c'est un peu maladroit. C'est un peu plus court:
Désolé pour la dérive loin de l'OP est prévu sujet, mais je soutiens que ce n'ajustement de poste titre du "Reverse une valeur de hachage dans Ruby".
si besoin:
à:
pouvez: