我有这个:
list = [[apple, John], [apple, Paul], [banana, Paul]]
是这样的:
list = [[apple, [John, Paul]], [banana, [Paul]]
我不知道如何解决这个问题,因为我需要知道每个元素的频率,并根据整个列表重新排序......
答案 0 :(得分:2)
list.group_by(&:first).map { |fruit, preferences| [fruit, preferences.map(&:last)] }
答案 1 :(得分:1)
list = [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]]
=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]]
使用Enumberable#each_with_object,根据哈希中的键聚合所有值,然后转换回数组
list.each_with_object(Hash.new{[]}) { |x, h| h[x.first] <<= x.last }.to_a
=> [["apple", ["John", "Paul"]], ["banana", ["Paul"]]]
答案 2 :(得分:0)
还有一种方法。
list = [%w|apple John|, %w|apple Paul|, %w|banana Paul|]
#=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]]
list.each_with_object({}) { |(fruit,name),h| h.update(fruit=>[name]) { |_k,o,n| o+n } }
#=> {"apple"=>["John", "Paul"], "banana"=>["Paul"]}
这使用Hash#update(aka merge!
)的形式,它使用块({ |_k,o,n| o+n }
)来确定合并的两个哈希中存在的键的值。有关三个块变量的定义,请参阅doc _k
,o
和n
。下划线告诉读者在块计算中不使用_k
(通常只写_
)。