对 ruby 中嵌套数组的数据进行分组

Grouping data from nested arrays in ruby

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

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.each_with_object({}) do |(name, age, books), hash|
  books.each do |book|
    (hash[book] ||= []) << name    
  end
end

如果必须将其设为数组,则在上面的输出后附加一个 .to_a