0

オブジェクトの配列があり、属性「位置」によって一意の配列を構築したい

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

しかし、2番目の属性「ミスマッチ」が等しいかそれ以上の場合、すべてのダブルスを捨てる前に区別したいと思います。たとえば、私は持っています:

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

そして最後に、ミスマッチの少ないものを維持したいと思います:

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

オブジェクト 1 と 3 の位置は同じでしたが、最後のオブジェクトではミスマッチが少なかったためです。

編集:ボックスはオブジェクトの配列であり、私はそれを次のように構築します:

@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
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 に答える
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 に答える