【问题标题】:Grouping data from nested arrays in ruby在 ruby​​ 中对嵌套数组中的数据进行分组
【发布时间】:2015-03-03 13:37:09
【问题描述】:

假设以下数据元组包含一个人的姓名、年龄和他读过的书:

list =     [
  ["Peter", 21, ["Book 1", "Book 2", "Book 3", "Book 4"],
  ["Amy", 19, ["Book 3", "Book 4"],
  ["Sanders", 32, ["Book 1", "Book 2",],
  ["Charlie", 21, ["Book 4", "Book 5", "Book 6"],
  ["Amanda", 21, ["Book 2", "Book 5"]
]

将按阅读的书籍分组的名称提取为以下格式的最佳方法是什么(基本上是一个包含书名的数组和阅读者姓名的数组)

results = [
   ["Book 1", ["Sanders", "Peter"]],
   ["Book 2", ["Sanders" "Amanda", "Peter"]],
   ["Book 3", ["Peter", "Amy"]],
   ["Book 4", ["Charlie", "Peter", "Amy"]],
   ["Book 5", ["Amanda","Charlie"]],
   ["Book 6", ["Charlie"]]
]

我尝试了以下迭代方法,该方法提取名称列表并将它们放入哈希中,以书名作为键。

book_hash = Hash.new([])
list.each { |name,age,books| 
books { |x|  book_hash[x] = book_hash[x] + [name] }
}
results = book_hash.to_a.sort

但是,在处理包含数百万个姓名的大型数据集时,上述方法似乎效率很低。我尝试使用 Array.group_by,但到目前为止我无法使其与嵌套数组一起使用。

有人对以上内容有任何想法吗?

【问题讨论】:

  • 你为什么期望你的解决方案给出一个散列的数组?在这种情况下,哈希更有意义。
  • 别偷懒。您应该为您的list 提供至少与您的样本结果相对应的足够样本数据。
  • @sawa 抱歉,我刚刚添加了一些示例数据和结果。

标签: ruby arrays enums


【解决方案1】:

哈希输出。比较合适。

list.each_with_object({}) do |(name, age, books), hash|
  books.each do |book|
    (hash[book] ||= []) << name    
  end
end

如果必须将其设为数组,则将.to_a 附加到上述输出。

【讨论】:

  • 这成功了,但是因为我运行的是 1.8.7,所以我选择了 .each 而不是 .each_with_object。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多