0

我有一个对象数组,想通过属性“位置”构建一个唯一的数组,比如

boxes.to_a.uniq! {|p| p[:position] }

但是如果第二个属性“不匹配”等于或更高,我想在扔掉所有双打之前进行区分。例如我有:

{ position: 233, mismatch: 3},
{ position: 234, mismatch: 3},
{ position: 233, mismatch: 1}

最后我想保留一个不匹配较少的:

{ position: 234, mismatch: 3},
{ position: 233, mismatch: 1}

因为对象 1 和 3 中的位置相同,但最后一个对象中的不匹配较少。

编辑:boxes 是一个对象数组,我像这样构建它:

@boxes = []

...

@boxes << {
              :position => i,
              :mismatch => mm,
          }

其中位置和错配是在 DNA 序列上计算的。错配表示到 9 个核苷酸基序的汉明距离(字符串,如 "TTGATGCTT" )

4

3 回答 3

3

我不确定这些哈希代表什么,因此您可能会想到更好的变量名称。

尝试:

boxes = [
  { position: 233, mismatch: 3},
  { position: 234, mismatch: 3},
  { position: 233, mismatch: 1},
]

boxes.group_by{ |box| box[:position] }
     .map{ |_, boxes| boxes.min_by{ |box| box[:mismatch] } }
#=> [{:position=>233, :mismatch=>1}, {:position=>234, :mismatch=>3}]
于 2013-05-11T23:39:09.443 回答
0

像这样的东西:

new_boxes = {}

boxes.each do |box|
  pos = box[:position]
  if new_boxes[pos] && new_boxes[pos][:mismatch] > box[:mismatch]
    new_boxes[pos] = box
  end
end

boxes = new_boxes.values
于 2013-05-11T23:35:25.947 回答
0
boxes = [
  { position: 233, mismatch: 1},
  { position: 234, mismatch: 3},
  { position: 233, mismatch: 3},
  { position: 234, mismatch: 2}
]

boxes.sort_by{|x| x.values }
     .uniq{|y| y[:position]}

#=> [{:position=>233, :mismatch=>1}, {:position=>234, :mismatch=>2}]
于 2013-05-12T09:18:40.583 回答