"Europe", "Andorra"=>"Europe", "Austria"=>"Europe", -6ren">
gpt4 book ai didi

ruby - 如何在散列中汇总散列?

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:58 24 4
gpt4 key购买 nike

我有这样一个哈希:

Some_hash =
{"Albania"=>"Europe",
"Andorra"=>"Europe",
"Austria"=>"Europe",
Lebanon"=>"Asia",
"Macau"=>"Asia",
"Malaysia"=>"Asia",
"Papua New Guinea"=>"Asia",
"Jamaica"=>"North America",
"Martinique"=>"North America",
"Argentina"=>"South America",
"Chile"=>"South America",
"Sao Tome and Principe"=>"Africa",
"Senegal"=>"Africa",
"Somalia"=>"Africa",}

我想分别识别五大洲,以及属于它们的国家,这样我最终会得到这样的东西:

{"Africa" => ["Senegal", "Somalia"]}
{"Europe" => ["Albania", "Andorra", "Austria"]}

所有大陆。

我试过这个:

def country
inflation_hash = {}
XPath.match( data, "//country").map do |element|
inflation_hash[element.attributes["name"]] = element.attributes["continent"]
end
inflation_hash.each do |country, continent|
new_hash = {}
if inflation_hash.has_value?("Africa") == true
new_hash["Africa"] = inflation_hash.keys
puts new_hash
end
end
end

而且效果非常好。我得到一个新哈希:

{Africa => []} 

但是我有两个问题:

  1. 我为每个非洲国家/地区创建一个新哈希。
  2. 每个新哈希包含所有键,其中包括所有非非洲国家/地区。

我认为第一个问题与 each 方法有关,所以我必须设置一些条件,对吗?

第二个问题,我不知道怎么解决。

如有指点,将不胜感激。

最佳答案

首先,不要像在 SomeHashXPath 中那样对 Ruby 中的变量使用大写字母。当变量名以大写字母开头时,表示它是一个常量,您可能不希望它是一个常量。

each 不是做到这一点的最佳方式,您可以使用 inject 更简单地做到这一点,如下所示:

countries = {
"Albania"=>"Europe",
"Andorra"=>"Europe",
"Austria"=>"Europe",
"Lebanon"=>"Asia",
"Macau"=>"Asia",
"Malaysia"=>"Asia",
"Papua New Guinea"=>"Asia",
"Jamaica"=>"North America",
"Martinique"=>"North America",
"Argentina"=>"South America",
"Chile"=>"South America",
"Sao Tome and Principe"=>"Africa",
"Senegal"=>"Africa",
"Somalia"=>"Africa"}

by_continents = countries.inject({}) do |memo, (k,v)|
memo[v] ||= []
memo[v] << k
memo
end

这个的输出是:

{"Europe"=>["Albania", "Andorra", "Austria"], "Asia"=>["Lebanon", "Macau", "Malaysia", "Papua New Guinea"], "North America"=>["Jamaica", "Martinique"], "South America"=>["Argentina", "Chile"], "Africa"=>["Sao Tome and Principe", "Senegal", "Somalia"]}

您将所有国家/地区按大陆分组,您可以选择其中任何一个。

在您的代码中,它应该像这样放置:

def country
inflation_hash = {}
XPath.match( data, "//country").map do |element|
inflation_hash[element.attributes["name"]] = element.attributes["continent"]
end
by_continents = inflation_hash.inject({}) do |memo, (k,v)|
memo[v] ||= []
memo[v] << k
memo
end
puts by_continents.inspect
by_continents
end

关于ruby - 如何在散列中汇总散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20449555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com