Menu
Coddy logo textTech

group_by y partition

Parte de la sección Lógica y flujo del Journey de Ruby de Coddy. Lección 25 de 56.

A veces quieres dividir una colección en lugar de filtrarla. Dos métodos cubren la mayoría de los casos.

group_by toma un bloque y devuelve un hash. Cada resultado único del bloque se convierte en una clave, que se mapea a un arreglo de los elementos que lo produjeron:

words = ["hi", "hello", "yo", "hey", "bonjour"]
by_length = words.group_by { |w| w.length }
puts by_length.inspect
# {2=>["hi", "yo"], 5=>["hello"], 3=>["hey"], 7=>["bonjour"]}

Es la forma más limpia de agrupar elementos en una sola pasada.

partition es la versión binaria: devuelve un par de arreglos, los elementos donde el bloque fue verdadero, y el resto:

evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect   # [2, 4]
puts odds.inspect    # [1, 3, 5]

Usa partition cuando hay exactamente dos grupos, y group_by cuando puede haber muchos.

challenge icon

Desafío

Intermedio

Lee una lista separada por comas de entradas name:score (por ejemplo, Alice:88,Bob:42,Charlie:75). Usa group_by seguido de partition para generar un pequeño informe.

Pasos:

  1. Convierte cada entrada en un par [name, score] (el score es un entero)
  2. Aplica group_by a la primera letra de name del par (en mayúscula)
  3. Para cada grupo de letras, en orden alfabético (alphabetical), aplica partition a las entradas en aprobados (score >= 60) y reprobados, y después imprime una línea por grupo:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>

Dentro de cada grupo, los nombres aparecen en su orden original. Si un lado no tiene nombres, déjalo vacío (por ejemplo, fail=).

Para la entrada Alice:88,Adam:42,Bob:75,Beth:55,Cara:90, la salida es:

A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=

Pruébalo tú mismo

entries = gets.chomp.split(",").map do |s|
  name, score = s.split(":")
  [name, score.to_i]
end

# TODO: agrupa por la primera letra (mayúscula), particiona cada grupo por puntuación >= 60,
#       imprime 'X: pass=... fail=...' en orden alfabético de letras
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de Ruby online