Arrays 根据ruby中的某个键对哈希数组进行分组和显示

Arrays 根据ruby中的某个键对哈希数组进行分组和显示,arrays,ruby,hash,Arrays,Ruby,Hash,我有这样一个哈希数组: [ {"a"=>"first", "b"=>[{"lt"=>7, "lg"=>8}]}, {"a"=>"first", "b"=>[{"lt"=>7, "lg"=>8}]}, {"a"=>"second", "b"=>[{"lt"=>7, "lg"=>8}]}, {"a"=>"third", "b"=>[{"lt"=>9, "lg"=>10}]} ] 如何按键

我有这样一个哈希数组:

[
  {"a"=>"first", "b"=>[{"lt"=>7, "lg"=>8}]},
  {"a"=>"first", "b"=>[{"lt"=>7, "lg"=>8}]},
  {"a"=>"second", "b"=>[{"lt"=>7, "lg"=>8}]},
  {"a"=>"third", "b"=>[{"lt"=>9, "lg"=>10}]}
]
如何按键值显示引用并显示类似的内容

[
  {{"a"=>"first", "b"=>[{"lt"=>7, "lg"=>8}]}=>2},
  {{"a"=>"second", "b"=>[{"lt"=>7, "lg"=>8}]}=>1},
  {{"a"=>"third", "b"=>[{"lt"=>9, "lg"=>10}]}=>1}
]
我正在寻找ruby way解决方案。

频率分布 您可以通过使用哈希和默认出现值0来定义Enumerablefrequency_分布:

它是这样工作的:

require 'pp'
data = [
    {"a"=>"first", "b"=>[{"lt"=>7, "lg"=>8}]},
    {"a"=>"first", "b"=>[{"lt"=>7, "lg"=>8}]},
    {"a"=>"second", "b"=>[{"lt"=>7, "lg"=>8}]},
    {"a"=>"third", "b"=>[{"lt"=>9, "lg"=>10}]}
]

pp data.frequency_distribution
# {{"a"=>"first", "b"=>[{"lt"=>7, "lg"=>8}]}=>2,
#  {"a"=>"second", "b"=>[{"lt"=>7, "lg"=>8}]}=>1,
#  {"a"=>"third", "b"=>[{"lt"=>9, "lg"=>10}]}=>1}
如果不想让修补程序可枚举,请执行以下操作:

注意,输出是一个散列。键是散列,值是整数。我想不出任何好的理由将其转换为1对哈希数组。查找速度会慢得多,可读性也会差得多

计数 对于更通用的方法,可以使用与group_by或sort_by相同的语法定义Enumerablecount_by:


我理解这个问题,它与给定数组的特定元素无关。更一般地说,给定一个数组

arr = [a,a,b,c] 
如果a、b和c是任意Ruby对象,则需要每个唯一元素的计数,表示为哈希数组。为了保持简单,假设

arr = [1,1,2,3]
这里有两种通过单次通过arr获得计数的方法

以及@Eric在回答中使用的计数散列

arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
  #=> [{ 1=>2 }, { 2=>1 }, { 3=>1 }]

我假设最终结果是散列,而不是数组。=>否则将是语法错误。抱歉,我编辑了!它也是一个数组。如果用键和值来描述它,那么它是一个数组吗?尝试在控制台中运行预期结果。它将创建一个数组,其中一个元素具有给定的键和值。抱歉,缺少括号。非常奇怪的转换。我已经更新了我的答案。如果您能更全面地了解为什么/如果您可能需要这种格式,也许我们可以为您提供更多帮助。使用foos=[1]*10,它会对数组进行100次解析,并创建10次完全相同的[1,10]数组…@EricDuminil,确实如此。而且它在^2上,但不在。太好了!那是我要找的。谢谢不客气。请注意,对于大型阵列,它应该比@ndn解决方案快得多。而且这两个答案的结果是不同的。是的我不会返回一对散列的数组。我想不出有什么好的理由这么做。我希望一个名为Arraycount__________________________________。类似于{h | h[a]}的count|u或&:本身的count|u。它可以在Enumerable中定义。@Stefan:对不起,这是一个混合了类似答案的旧代码。我用count_by&block更新了答案。
foos.map { |foo| {foo => foos.count(foo)} }.uniq
arr = [a,a,b,c] 
arr = [1,1,2,3]
arr.group_by(&:itself).map { |k,v| { k=>v.size } }
  #=> [{ 1=>2 }, { 2=>1 }, { 3=>1 }]
arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
  #=> [{ 1=>2 }, { 2=>1 }, { 3=>1 }]