辞書/ハッシュのデフォルト値

pythonの辞書にはsetdefaultという便利なメソッドがあって、キーに対する値がないときのデフォルト値を渡すことができる

data = [('japan', 'tokyo'), ('uk', 'london'), ('japan', 'osaka')]

h = {}
for country, city in data:
    h.setdefault(country, []).append(city)

print h
# => {'japan': ['tokyo', 'osaka'], 'uk': ['london']}


rubyだとどうかなと思ってちょっとだけ調べたけど、なさそうだったので普通に書いてみました

data = [['japan', 'tokyo'], ['uk', 'london'], ['japan', 'osaka']]

h = Hash.new()
data.each do |country, city|
  (h[country.to_sym] ||= []) << city
end

puts h
# => {:japan=>["tokyo", "osaka"], :uk=>["london"]}