Diciamo che ho una lista [1, 2, 3, 4]
elisir - come ottenere tutti gli elementi eccetto l'ultimo della lista?
Come posso ottenere tutti gli elementi da questo elenco eccetto l'ultimo? Così, avrò [1, 2, 3]
Diciamo che ho una lista [1, 2, 3, 4]
elisir - come ottenere tutti gli elementi eccetto l'ultimo della lista?
Come posso ottenere tutti gli elementi da questo elenco eccetto l'ultimo? Così, avrò [1, 2, 3]
La mia soluzione (penso che non è un ambiente pulito, ma funziona!)
a = [1, 2, 3, 4]
[head | tail] = Enum.reverse(a)
Enum.reverse(tail) # [1, 2, 3]
Usa Enum.drop/2 in questo modo:
list = [1, 2, 3, 4]
Enum.drop list, -1 # [1, 2, 3]
Hm, idea interessante! – asiniy
altro l'opzione oltre allo list |> Enum.reverse |> tl |> Enum.reverse
menzionata in precedenza è la funzione :lists.droplast
di Erlang, che è più lenta secondo la documentazione, ma crea meno garbage perché non crea due nuovi elenchi. A seconda del caso d'uso che potrebbe essere interessante da usare.
Un'altra opzione, anche se non elegante, sarebbe -
list = [1, 2, 3, 4]
Enum.take(list, Enum.count(list) -1) # [1, 2, 3]
Se stai cercando di ottenere sia l'ultimo elemento e il resto della lista che lo precede è ora possibile utilizzare List.pop_at/3
:
{last, rest} = List.pop_at([1, 2, 3], -1)
{3, [1, 2]}
Potrebbe non essere intuitivo, ma basato su un test rapido, è il più efficace. https://gist.github.com/ckhrysze/015a8748910c8d467bd2a6e2c832a670 ## PopBench invertire 500000 6,64 ms/op goccia 500000 6,73 ms/op prendere 100000 26.07 ms/op – Chris
realtà questo è un modello molto comune in molti degli implementazioni delle funzioni Enum. C'è un ottimizzato: list.reverse in Erlang che viene usato dopo una riduzione ti dà la lista che vuoi ma nel retro dell'ordine che desideri. –