Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将哈希转换为哈希数组_Arrays_Ruby_Hashmap - Fatal编程技术网

Arrays 将哈希转换为哈希数组

Arrays 将哈希转换为哈希数组,arrays,ruby,hashmap,Arrays,Ruby,Hashmap,我有散列,它的所有值都是数组,如下所示: list = { letter: ['a', 'b', 'c'], number: ['one', 'two', 'three'], fruit: ['apple', 'pear', 'kiwi'], car: ['vw', 'mb', 'bmw'], state: ['la', 'ny', 'fl'], color: ['red', 'wh

我有散列,它的所有值都是数组,如下所示:

list = { letter:  ['a', 'b', 'c'],
         number:  ['one', 'two', 'three'],
         fruit:   ['apple', 'pear', 'kiwi'],
         car:     ['vw', 'mb', 'bmw'],
         state:   ['la', 'ny', 'fl'],
         color:   ['red', 'white', 'black'],
         tree:    ['oak', 'pine', 'maple'],
         animal:  ['cat', 'dog', 'rat'],
         clothes: ['tie', 'sock', 'glove'] }
事实上,这个散列可以有更多的键,值也可以更大,但每个值的大小总是相同的(在本例中为-3)

我想把这个散列转换成散列数组

每个散列将具有所有源散列键和各自的值

最后,我想:

list = [
  { letter: 'a', number: 'one', fruit: 'apple', car: 'vw', state: 'la',
    color: 'red', tree: 'oak', animal: 'cat', clothes: 'tie' },

  { letter: 'b', number: 'two', fruit: 'pear', car: 'mb', state: 'ny',
    color: 'white', tree: 'pine', animal: 'dog', clothes: 'sock' },

  { letter: 'c', number: 'three', fruit: 'kiwi', car: 'bmw', state: 'fl',
    color: 'black', tree: 'elm', animal: 'rat', clothes: 'glove' }
]
最好的方法是什么?

试试下面的代码

arr = []
3.times { |x| arr[x] = {}; list.each { |k,v| arr[x][k] = v[x] } }
arr.inspect
输出将是

=> [{:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw", :state=>"la", :color=>"red", :tree=>"oak", :animal=>"cat", :clothes=>"tie"}, {:letter=>"b", :number=>"two", :fruit=>"pear", :car=>"mb", :state=>"ny", :color=>"white", :tree=>"pine", :animal=>"dog", :clothes=>"sock"}, {:letter=>"c", :number=>"three", :fruit=>"kiwi", :car=>"bmw", :state=>"fl", :color=>"black", :tree=>"maple", :animal=>"rat", :clothes=>"glove"}]
杠杆作用和

一应俱全:

list.map{|k,v| [k].product(v)}.transpose.map(&:to_h)
其思想是使用每个关键产品的值,映射、转置,然后通过
转换为散列

[list.keys].product(list.values.transpose).map { |a| a.transpose.to_h }
   #=> [{:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw", 
   #     :state=>"la", :color=>"red", :tree=>"oak", :animal=>"cat",
   #     :clothes=>"tie"},
   #    {:letter=>"b", :number=>"two", :fruit=>"pear", :car=>"mb",
   #     :state=>"ny", :color=>"white", :tree=>"pine", :animal=>"dog",
   #     :clothes=>"sock"},
   #    {:letter=>"c", :number=>"three", :fruit=>"kiwi", :car=>"bmw",
   #     :state=>"fl", :color=>"black", :tree=>"maple", :animal=>"rat", 
   #     :clothes=>"glove"}]
假设
list
定义如下

list = {
  letter:  ['a',     'b'   ],
  number:  ['one',   'two' ],
  fruit:   ['apple', 'pear'],
  car:     ['vw',    'mb'  ]
}
b = [list.keys]
  #=> [[:letter, :number, :fruit, :car]]
c = list.values
  #=> [["a", "b"], ["one", "two"], ["apple", "pear"], ["vw", "mb"]]
d = c.transpose
  #=> [["a", "one", "apple", "vw"],
  #    ["b", "two", "pear",  "mb"]]
e = b.product(d)
  #=> [[[:letter, :number, :fruit, :car], ["a", "one", "apple", "vw"]],
  #    [[:letter, :number, :fruit, :car], ["b", "two", "pear",  "mb"]]]
e.map { |a| a.transpose.to_h }
  #=> [{:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw"},
  #    {:letter=>"b", :number=>"two", :fruit=>"pear",  :car=>"mb"}]
f = a.transpose
  #=> [[:letter, "a"], [:number, "one"], [:fruit, "apple"], [:car,   "vw"]]
f.to_h
  #=> {:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw"}
步骤如下

list = {
  letter:  ['a',     'b'   ],
  number:  ['one',   'two' ],
  fruit:   ['apple', 'pear'],
  car:     ['vw',    'mb'  ]
}
b = [list.keys]
  #=> [[:letter, :number, :fruit, :car]]
c = list.values
  #=> [["a", "b"], ["one", "two"], ["apple", "pear"], ["vw", "mb"]]
d = c.transpose
  #=> [["a", "one", "apple", "vw"],
  #    ["b", "two", "pear",  "mb"]]
e = b.product(d)
  #=> [[[:letter, :number, :fruit, :car], ["a", "one", "apple", "vw"]],
  #    [[:letter, :number, :fruit, :car], ["b", "two", "pear",  "mb"]]]
e.map { |a| a.transpose.to_h }
  #=> [{:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw"},
  #    {:letter=>"b", :number=>"two", :fruit=>"pear",  :car=>"mb"}]
f = a.transpose
  #=> [[:letter, "a"], [:number, "one"], [:fruit, "apple"], [:car,   "vw"]]
f.to_h
  #=> {:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw"}
让我们更仔细地看最后一步
map
e
的第一个元素传递给块,并将块变量
a
设置为其值:

a = e.first
  #=> [[:letter, :number,  :fruit,  :car],
  #    ["a",     "one",    "apple", "vw"]]
区块计算如下所示

list = {
  letter:  ['a',     'b'   ],
  number:  ['one',   'two' ],
  fruit:   ['apple', 'pear'],
  car:     ['vw',    'mb'  ]
}
b = [list.keys]
  #=> [[:letter, :number, :fruit, :car]]
c = list.values
  #=> [["a", "b"], ["one", "two"], ["apple", "pear"], ["vw", "mb"]]
d = c.transpose
  #=> [["a", "one", "apple", "vw"],
  #    ["b", "two", "pear",  "mb"]]
e = b.product(d)
  #=> [[[:letter, :number, :fruit, :car], ["a", "one", "apple", "vw"]],
  #    [[:letter, :number, :fruit, :car], ["b", "two", "pear",  "mb"]]]
e.map { |a| a.transpose.to_h }
  #=> [{:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw"},
  #    {:letter=>"b", :number=>"two", :fruit=>"pear",  :car=>"mb"}]
f = a.transpose
  #=> [[:letter, "a"], [:number, "one"], [:fruit, "apple"], [:car,   "vw"]]
f.to_h
  #=> {:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw"}
e.map{a | a.transpose.to_h}
的其余计算类似。

仅用于:


list.values.transpose.each_与_对象([]){v,a | a类似
keys=list.keys;list.values.transpose.map{v |[keys,v].transpose.to_h}
不一样,更像是,为什么我不直接映射值…:p我会更新,谢谢
3
从哪里来?在他的例子中,3是通过检查
list
来获取的。他可以通过一些必需的逻辑从
list
动态获取。如果需要,我也会提供:)1.
map
更惯用>收集
2.
每对
都是多余的。这类似于@Marcin的答案。主要区别在于我使用了和使用了,而不是,后者是阴阳。@mechnicov,谢谢你的夸奖,也感谢你提到了混淆列表的问题。我解决了这个问题。