2 array di array:fare 2 matrici della stessa dimensione
a = [[1, 2], [22, 11], [18, 9]]
b = [[1, 81]]
Qual è il modo migliore per riempire il secondo quello con [0,0] in modo da avere la stessa dimensione?
2 array di array:fare 2 matrici della stessa dimensione
a = [[1, 2], [22, 11], [18, 9]]
b = [[1, 81]]
Qual è il modo migliore per riempire il secondo quello con [0,0] in modo da avere la stessa dimensione?
b.fill(b.size..a.size - 1) { [0, 0] }
A mio parere, questo è più leggibile:
(a.length - b.length).times do
b << [0, 0]
end
In termini di chiarezza, questa è la soluzione migliore fino ad ora. – Drenmi
mi piace fill
, ma che sembra essere stato preso. Ecco un modo per restituire la matrice desiderata senza mutare b
. Che non è stato chiesto per, ma potrebbe essere utile in alcune applicazioni:
Array.new(a.size) { |i| b[i] || [0,0] }
#=> [[1, 81], [0, 0], [0, 0]]
Si potrebbe, naturalmente, mettere b =
di fronte.
Un altro modo in-posto è:
b.concat [[0,0]]*(a.size-b.size)
Hey, questo è divertente. Un altro (fatti salvi elementi di b
uguale nil
):
a.each_index { |i| b[i] ||= [0,0] }
b
'Se b deve essere modificato sul posto, mettere b = in primo piano. - Questo non è a posto, è riassegnazione. –
Sei corretto. Grazie. Ho fatto una modifica. –
Non il più efficiente, ma abbastanza leggibile:
b << [0,0] until a.size == b.size
Un po 'più efficiente:
b.concat [[0,0]] * (a.size-b.size)
vorrei append
while
la dimensione è più piccola, perché penso che sia piacevole:
a = [[1, 2], [22, 11], [18, 9]]
b = [[1, 81]]
b << [0, 0] while b.size < a.size
b #=> [[1, 2], [0, 0], [0, 0]]
Buona risposta. Non ero a conoscenza della forma di [Array # fill] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-fill) che utilizza un intervallo come argomento. È interessante che funzioni anche con 'b.size> a.size' (che suppongo sia una proprietà' Range'). Ovviamente potresti scrivere '(b.size ... a.size)'. –