[解決済み] ハッシュのキーと値を入れ替える方法
2022-04-22 01:17:13
質問
Hashのキーと値を入れ替えるにはどうしたらいいですか?
次のようなHashがあります。
{:a=>:one, :b=>:two, :c=>:three}
に変換したい。
{:one=>:a, :two=>:b, :three=>:c}
使用方法
map
は、かなり面倒なようです。もっと手軽な解決策はないのでしょうか?
どのように解決するのですか?
RubyにはHashのヘルパーメソッドがあり、Hashを反転させたように扱うことができます(要するに、値を通してキーにアクセスできるようにする)。
{a: 1, b: 2, c: 3}.key(1)
=> :a
反転したハッシュを維持したいのであれば ハッシュ#invert は、ほとんどの状況で動作するはずです。
{a: 1, b: 2, c: 3}.invert
=> {1=>:a, 2=>:b, 3=>:c}
でも...
値が重複している場合。
invert
は、最後に出現した値以外をすべて破棄します (反復処理中にそのキーの新しい値を置き換え続けるからです)。同様に
key
は最初にマッチしたものだけを返します。
{a: 1, b: 2, c: 2}.key(2)
=> :b
{a: 1, b: 2, c: 2}.invert
=> {1=>:a, 2=>:c}
したがって、値が一意である場合は、以下のように使用できます。
Hash#invert
. そうでない場合は、このようにすべての値を配列として保持することができます。
class Hash
# like invert but not lossy
# {"one"=>1,"two"=>2, "1"=>1, "2"=>2}.inverse => {1=>["one", "1"], 2=>["two", "2"]}
def safe_invert
each_with_object({}) do |(key,value),out|
out[value] ||= []
out[value] << key
end
end
end
注:このテスト付きコードは、現在 をGitHubで公開しています。 .
または
class Hash
def safe_invert
self.each_with_object({}){|(k,v),o|(o[v]||=[])<<k}
end
end
関連
-
[解決済み】Ruby:kind_of? vs. instance_of? vs. is_a?
-
[解決済み] Rubyがブロックの中でパイプ文字を使うことについて、誰か説明してください。
-
[解決済み] Rubyでnil値をマッピングして削除する方法
-
[解決済み] Rubyで配列を降順にソートする方法
-
[解決済み] Ruby で PDF 文書を解析する
-
[解決済み] 動的な定数割り当て
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み】Ruby: ハッシュキーのフィルタリングを行う最も簡単な方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】macOSでrbenvをアンインストールする方法とは?
-
[解決済み】未定義のメソッド(NoMethodError)ruby
-
[解決済み] ルビーオールウェイズ ラウンドアップ
-
[解決済み] RubyのHashをキーでアルファベット順にソートする方法
-
[解決済み] ルビー最大整数
-
[解決済み] ルビーです。そのようなファイルやディレクトリはありません @ rb_sysopen - testfile (Errno::ENOENT)
-
[解決済み] Rubyのcontinueに相当します。
-
[解決済み] Railsアプリでhttpartyを使用して基本認証を使用するには?
-
[解決済み] Rubyの予期しないキーワードの終了、および予期しない入力の終了
-
[解決済み] [RubyでEnumを実装するには?