Ruby:来自数组的水合哈希值

时间:2017-11-14 08:26:48

标签: ruby-on-rails ruby

假设我有一个这样的ruby数组:

values = ['val_a', 'val_b',..., 'val_z'] # 26 values

带键的哈希

hash = {a: nil, b: nil, ... , z: nil} # 26 keys

我知道数组已排序,我知道哈希的键是排序的,我知道数组和哈希的大小相同。

我如何优雅地水合哈希值,以便我最终得到

{a: 'val_a', b: 'val_b', ... , z: 'val_z'}

2 个答案:

答案 0 :(得分:8)

df.show
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   A|   B|   C|
|   D|   E|   F|
|   X|   Y|   Z|
|   A|   N|   Z|
+----+----+----+

import org.apache.spark.sql.functions._
val query = df.columns.map(x => collect_set(col(x) ).as(x) )

df.groupBy(lit(1))
  .agg(collect_set($"col1"), query: _*)
  .select(df.columns.map(col(_)): _* )
  .show
+---------+------------+---------+
|     col1|        col2|     col3|
+---------+------------+---------+
|[A, D, X]|[B, E, Y, N]|[C, F, Z]|
+---------+------------+---------+

请注意,在某些(大多数?)语言中,散列/映射的键是无序的,因此无效。 Ruby<的情况也是如此。 1.9,但是,从那时起,它们将被保证订购(插入订单)。

答案 1 :(得分:3)

从Ruby 2.4.0开始,您可以执行以下操作:

hash.transform_values.with_index { |v,i| values[i] }

使用Hash#transform_values,意图很明确。它的危险对手Hash#transform_values!也可以使用。