我想将更多数组推入这个哈希?

时间:2018-03-27 04:25:14

标签: arrays ruby graph hash push

我想将数组推入这一部分,我是Ruby的新手

@edge_weights = {[position, position2] => node_distance}

那是哈希?我想我想以同样的方式推动其他一些哈希,得到这样的结果:

{["1", "2"]=>2445, ["2", "3"]=>2015, ["2", "4"]=>1547, ["3", "4"]=>939, ["5", "1"]=>1548}

不喜欢这样:

{["1", "2"]=>111},{["2", "3"]=>222},{["1", "3"]=>333}

我怎样才能实现这一目标?抱歉我的英文不好:(

2 个答案:

答案 0 :(得分:1)

据推测,您将从一些数据开始,例如以下数组:

arr = [["1", "2", 2445], ["2", "3", 2015], ["2", "4", 1547],
       ["3", "4", 939], ["5", "1", "7", 1548], ["1", "2", -71]]

第一步是创建一个空哈希:

h = {}

现在迭代arr的元素以构建哈希h

arr.each do |a|
  *first, last = a
  h[first] = last
end
  #=> [["1", "2", 2445], ["2", "3", 2015], ["2", "4", 1547],
  #    ["3", "4", 939], ["5", "1", "7", 1548], ["1", "2", -71]]

我们想要h的值,而不是上面的返回值。

h #=> {["1", "2"]=>-71, ["2", "3"]=>2015, ["2", "4"]=>1547,
  #    ["3", "4"]=>939, ["5", "1"]=>1548, ["5", "1", "7"]=>1548}

请注意,Ruby&#39> splat 运算符 1 用于以各种方式分解数组:

*first, last = ["5", "1", "7", 1548]
first
  #=> ["5", "1", "7"]
last
  #=> 1548

h上面的结果是您所期望的吗?回想一下哈希有唯一的密钥。将arr的第一个元素传递给块后,我们执行

h[["1", "2"]] = 2445

以便h成为{ ["1", "2"]=>2445 }。之后,当arr的最后一个元素 - 具有相同的键(["1", "2"]) - 被传递给块时,我们执行

h[["1", "2"]] = -71

覆盖该键的值。如果您希望保留第一个键的值,则可以编写

arr.each do |a|
  *first, last = a
  h[first] = last unless h.key?(first)
end

请参阅Hash#key?(又名has_key?include?)。 (旁白:你可以写...if !h.key?(first)!而不是,但通常使用unless来避免否定更清楚。)

" Ruby方式"编写原始构造的方法是使用方法Enumerable#each_with_object并展开块变量a

arr.each_with_object({}) do |(*first, last),h|
  h[first] = last
end
  #=> {["1", "2"]=>-71, ["2", "3"]=>2015, ["2", "4"]=>1547,
  #    ["3", "4"]=>939, ["5", "1"]=>1548, ["5", "1", "7"]=>1548}

这样就无需使用单独的语句来创建空哈希,代码块返回h的值。

(如果您不理解这一点,请不要担心。)

构造哈希的另一种常用方法是使用方法Hash#update(又名merge!):

arr.each_with_object({}) do |(*first, last),h|
  h.update({ first=>last })
end

注意Ruby允许第二行的简写版本:

  h.update(first=>last)

1参见"多变量赋值" here

答案 1 :(得分:0)

您可以将数组作为def count_occurrences(a_list): count_list = {} for i in a_list: if i not in count_list: count_list[i] = 1 else: count_list[i] += 1 return count_list 传递,并为其指定key

value