group_by und partition
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 25 von 56.
Manchmal möchten Sie eine Sammlung aufteilen, anstatt sie zu filtern. Zwei Methoden decken die meisten Fälle ab.
group_by nimmt einen Block entgegen und gibt einen Hash zurück. Jedes eindeutige Blockergebnis wird zu einem Schlüssel, der einer Liste der Elemente zugewiesen wird, die dieses Ergebnis erzeugt haben:
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 ist die sauberste Möglichkeit, Elemente in einem Durchgang zu gruppieren.
partition ist die binäre Variante: Es gibt ein Paar von Arrays zurück, die Elemente, bei denen der Block true war, und den Rest:
evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect # [2, 4]
puts odds.inspect # [1, 3, 5]Verwende partition, wenn es genau zwei Buckets gibt, und group_by, wenn es viele sein können.
Aufgabe
MittelLies eine durch Kommas getrennte Liste von name:score-Einträgen ein (z. B. Alice:88,Bob:42,Charlie:75). Verwende group_by gefolgt von partition, um einen kleinen Bericht zu erstellen.
Schritte:
- Parse jeden Eintrag in ein
[name, score]-Paar (score ist eine Ganzzahl) - Wende
group_byauf den ersten Buchstaben vonnamedes Paares an (Großbuchstabe) - Teile für jede Buchstabengruppe in alphabetischer Reihenfolge die Einträge mit
partitionin bestanden (score >= 60) und nicht bestanden auf und gib dann eine Zeile pro Gruppe aus:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>Innerhalb jeder Gruppe erscheinen die Namen in ihrer ursprünglichen Reihenfolge. Wenn eine Seite keine Namen enthält, lasse sie leer (z. B. fail=).
Für die Eingabe Alice:88,Adam:42,Bob:75,Beth:55,Cara:90 lautet die Ausgabe:
A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=Probier es selbst
entries = gets.chomp.split(",").map do |s|
name, score = s.split(":")
[name, score.to_i]
end
# TODO: gruppiere nach erstem Buchstaben (Großbuchstabe), partitioniere jede Gruppe nach score >= 60,
# drucke 'X: pass=... fail=...' in alphabetischer Buchstabenreihenfolge
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmfluss
1Strings im Detail
Überblick über String-MethodenString-InterpolationStrings durchlaufenSplitten und VerbindenRückblick – String Weaver4Blocks, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas Schlüsselwort yieldBlock-ParameterProcs und LambdasRückblick – Benutzerdefinierter Iterator2Bereiche
Was ist ein Bereich?BereichsmethodenBereiche in Case / WhenWiederholung – Übung zu Bereichen5Das Enumerable-Kraftpaket
Select und RejectMap verkettenReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Datenpipeline8Fortgeschrittene Entscheidungsfindung
Case mit Klassen & Regexwhen mit mehreren WertenTernärer OperatorInline-if / unlessRückblick – NotenklassifiziererÜbe selbstständig: Online-Ruby-Compiler