假设我有一个看起来像这样的数组:
> head(df)
d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20
758 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0
759 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0
760 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0
761 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0
762 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0
763 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1
有没有办法让我得到一个看起来像的哈希:
[
[["str1"],["val1"],["val2"]],
[["str2"], ["val1"], ["val2"], ["val3"]]
]
答案 0 :(得分:3)
whileStatement: "while" '(' expression ')' statement
如果您不希望将每个元素放在单独的数组中:
a.map { |a| [a.first.first, a.drop(1)] }.to_h
# or
a.each_with_object({}) {|a, h| h[a.first.first] = a.drop(1) }
#=> {
# "str1"=>[["val1"], ["val2"]],
# "str2"=>[["val1"], ["val2"], ["val3"]]
# }
答案 1 :(得分:2)
如果你的数组是arr
,你可以写下以下内容。
Marshal.load(Marshal.dump(arr)).map { |a| [a.shift.first, a.map(&:first)] }.to_h
#=> {"str1"=>["val1", "val2"],
# "str2"=>["val1", "val2", "val3"]}
略有变化:
Marshal.load(Marshal.dump(arr)).map { |a| [a.shift.first, a] }.to_h
#=> {"str1"=>["val1", "val2"],
# "str2"=>["val1", "val2", "val3"]}
注意:我们正在使用Marshal类制作arr
的精确副本,以避免修改原始数组。 Object#dup或Object#clone在这里工作不起作用。
答案 2 :(得分:0)
arr = [
[["str1"],["val1"],["val2"]],
[["str2"], ["val1"], ["val2"], ["val3"]]
]
arr.each_with_object({}) { |((k), *values), h| h[k]=values }
#=> {"str1"=>[["val1"], ["val2"]], "str2"=>[["val1"], ["val2"], ["val3"]]}
这说明了Ruby如何使用并行赋值来确定块变量的值是有利的。