group_by e partition
Fa parte della sezione Logica e flusso del percorso Ruby di Coddy. Lezione 25 di 56.
A volte vuoi suddividere una raccolta invece di filtrarla. Due metodi coprono la maggior parte dei casi.
group_by accetta un blocco e restituisce un hash. Ogni risultato univoco del blocco diventa una chiave, associata a un array degli elementi che lo hanno prodotto:
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"]}È il modo più pulito per raggruppare gli elementi in un solo passaggio.
partition è la versione binaria: restituisce una coppia di array, gli elementi per cui il blocco è risultato vero e il 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 quando ci sono esattamente due gruppi, group_by quando possono essercene molti.
Sfida
MedioLeggi un elenco di voci name:score separate da virgole (ad es. Alice:88,Bob:42,Charlie:75). Usa group_by seguito da partition per produrre un breve resoconto.
Passaggi:
- Analizza ogni voce in una coppia
[name, score](scoreè un intero) - Raggruppa con
group_byin base alla prima lettera diname(maiuscola) - Per ogni gruppo di lettere, in ordine alfabetico, usa
partitionper suddividere le voci in promossi (score >= 60) e bocciati, quindi stampa una riga per gruppo:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>All'interno di ogni gruppo, i nomi compaiono nell'ordine originale. Se un lato non contiene nomi, lascialo vuoto (ad es. fail=).
Per l'input Alice:88,Adam:42,Bob:75,Beth:55,Cara:90, l'output è:
A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=Provalo tu
entries = gets.chomp.split(",").map do |s|
name, score = s.split(":")
[name, score.to_i]
end
# TODO: raggruppa per prima lettera (maiuscola), suddividi ogni gruppo in base a score >= 60,
# stampa 'X: pass=... fail=...' in ordine alfabetico delle lettere
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Panoramica dei metodi delle stringheInterpolazione di stringheIterare sulle stringheDividere e unireRiepilogo - Tessitore di stringhe4Blocchi, Proc e Lambda
Che cos’è un Block?do..end vs parentesi graffeLa keyword yieldParametri del BlockProc e LambdaRiepilogo - Iteratore personalizzato7Hash in Ruby - Parte 2
Hash.new con valori predefinitiIterare sugli hashHash annidatiUnire e trasformareRipasso - Contatore di frequenza10Progetto - Registri degli studenti
Panoramica del progettoAggiungere uno studente2Intervalli
Che cos'è un intervallo?Metodi degli intervalliIntervalli in Case / WhenRiepilogo - Esercitarsi con gli intervalli5La potenza di Enumerable
Select e RejectConcatenare MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRiepilogo - Pipeline di datiEsercitati da solo: Compilatore Ruby online