繁体   English   中英

"Ruby 'group_by'-like 哈希方法"

[英]Ruby 'group_by'-like method for hash

我需要一个 Ruby 函数,它以哈希作为输入(键是符号,值是数字数组)并返回其关联数组具有相同第一个值的键列表。

这是一个例子:

h={
  :k1 => [2,3,5,12],
  :k2 => [9,5,6,10],
  :k3 => [2,4,5, 8],
}

f(h) # should return [[:k1,:k3]] 

...因为 2 在与:k1:k3关联的两个数组中显示为相同的值。 返回的 Object 是一个数组数组(因为,几组键可以具有相同的数组第一个值)。

到目前为止,我只是将数组本身分组:

def f(h)
  h.values.group_by{|ary| ary.first}
end   

# returns {2=>[[2, 3, 5, 12], [2, 4, 5, 8]], 9=>[[9, 5, 6, 10]]}

为什么不只使用group_by作为问题的标题提示:

h2 = h.group_by { |k, v| v.first }

这给你这样的东西:

{2=>[[:k1, [2, 3, 5, 12]], [:k3, [2, 4, 5, 8]]], 9=>[[:k2, [9, 5, 6, 10]]]}

然后,您可以将其用于进一步处理。 只想要钥匙?

h3 = h2.values.map { |v| v.map(&:first) }

只想拥有一把以上钥匙的人吗?

h3.reject { |v| v.length < 2 }

或直接在h2

h2.reject { |k, v| v.length < 2 }

我想到了这个丑陋的东西:

h.inject({}) do |memo, (key, array)|
  memo[array[0]] ||= []
  memo[array[0]] << key
  memo
end.detect do |(key, values)|
  values.size > 1
end.last

它基本上以以下形式重新映射哈希:

{first_item_in_array => keys_that_contain_it}

或者,在我们的情况下:

{2=>[:k1, :k3]}

然后,它仅检测具有多个匹配项的第一对并返回:

[:k1, :k3]

希望有帮助!

也许你可以使用这样的东西

def get_same_first_value(h)
  h.each_with_object(Hash.new { |k, v| k[v] = [] }) do |(sym, arr), exp|
    exp[arr.min] << sym
  end.select { |k, v| v.size != 1 }.values
end

h = {
  :k1 => [2, 3, 5, 12],
  :k2 => [9, 5, 6, 10],
  :k3 => [2, 4, 5, 8],
}

get_same_first_value(h)
# => [[:k1, :k3]]
This is for list of array.
array1 = [1,2,3,4,5,6,7,8,9,10,11,12,13]
myarray = []
myfinalarray = []
array1.each do |item|
    if myarray.size == 3
        myfinalarray.push(myarray)
        myarray = []
    end 
    myarray.push(item)
end 
myfinalarray.push(myarray)
puts "group of 3 items of an array #{myfinalarray}"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM