对 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
。
假设以下数据元组包含一个人的姓名、年龄和他读过的书:
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
。