es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transformar los valores hash basados en una condición después de usar group_by.

Tengo una matriz de pipes que tienen los siguientes atributos: pipe_id, grade y grade_confidence.

Estoy buscando encontrar objetos dentro de una matriz que tengan los mismos atributos que otros objetos con el mismo ID. He estado utilizando groupby y transformvalues para encontrar los IDs que tienen solo una calificación – eso funciona bien (gracias a las respuestas en https://stackoverflow.com/questions/69408475/using-group-by-for-only-certain-attributes). Sin embargo, me gustaría mantener el grade_confidence en el resultado final si es posible.

class Pipes
  attr<em>accessor :pipe</em>id, :grade, :grade<em>confidence
  def initialize(pipe</em>id, grade, grade<em>confidence)
    @pipe</em>id = pipe<em>id
    @grade = grade
    @grade</em>confidence = grade_confidence
  end
end
pipe1 = Pipes.new("10001", "60", "A")
pipe2 = Pipes.new("10001", "60", "A")
pipe3 = Pipes.new("10001", "3", "F")
pipe4 = Pipes.new("1005", "15", "A")
pipe5 = Pipes.new("1004", "40", "A")
pipe6 = Pipes.new("1004", "40", "B")
pipes = []
pipes.push(pipe1, pipe2, pipe3, pipe4, pipe5, pipe6)

Ahora tenemos nuestra matriz de objetos pipe.

non<em>dups = pipes.group</em>by(&:pipe<em>id).transform</em>values { |a| a.map(&:grade).uniq }.select { |k,v| v.size == 1 }
puts non_dups

=> {“1005″=>[“15”], “1004”=>[“40”]}

Deseado

Lo anterior hace lo que quiero: como “10001” tiene dos grade diferentes, se ignora, y “1004” y “1005” tienen las mismas calificaciones por ID. Pero lo que me gustaría es mantener el grade_confidence también, o incluir grade_confidence en función de una condición también.

Por ejemplo, si grade_confidence es == "B", el resultado final sería # => {"1004"=>["40", "B"]}

o

Si grade_confidence es == "A", el resultado final sería # => {"1005"=>["15", "A"], "1004"=>["40", "A"]}

¿Es posible ajustar el transform_values para permitir esto o necesitaría usar otra opción?

Gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, podemos modificar el bloque transform_values para crear un arreglo que contenga tanto los valores grade como grade_confidence, y luego usar condiciones adicionales para filtrar el resultado basado en los valores deseados de grade_confidence.

    Aquí está el código actualizado:

    non_dups_with_confidence = pipes.group_by(&:pipe_id).transform_values do |p|
      arr = p.map { |pipe| [pipe.grade, pipe.grade_confidence] }.uniq
      arr.reject! { |grade, confidence| confidence != "A" && confidence != "B" }
      arr.map { |grade, confidence| confidence.nil? ? [grade] : [grade, confidence] }.flatten
    end.select { |k, v| v.size > 1 }
    
    puts non_dups_with_confidence
    # => {"1005"=>["15", "A"], "1004"=>["40", "A", "B"]}
    

    En esta versión, creamos un arreglo de pares de grade y grade_confidence para cada pipe_id, usamos uniq para eliminar duplicados y filtramos cualquier par que no tenga los valores deseados de grade_confidence. Luego, mapeamos los pares restantes a un arreglo que incluye tanto grade como grade_confidence, o solo grade si grade_confidence es nulo. Finalmente, aplanamos los arreglos resultantes para obtener un único arreglo de grades y grade_confidences.

    También utilizamos el método select para filtrar cualquier entrada de pipe_id que tenga menos de dos valores en el arreglo resultante (ya que no tendrían duplicados).

    Esto debería dar el resultado deseado de devolver un arreglo de pipe_ids y sus respectivos grades y grade_confidences, filtrados por un valor especificado de grade_confidence.

Comments are closed.