我想将数组推入这一部分,我是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}
我怎样才能实现这一目标?抱歉我的英文不好:(
答案 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