2016-03-26 6 views

risposta

12

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] 
+0

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

+0

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. –

16

Usa Enum.drop/2 in questo modo:

list = [1, 2, 3, 4] 
Enum.drop list, -1  # [1, 2, 3] 
+0

Hm, idea interessante! – asiniy

1

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.

0

Un'altra opzione, anche se non elegante, sarebbe -

list = [1, 2, 3, 4] 
Enum.take(list, Enum.count(list) -1) # [1, 2, 3] 
0

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]} 

https://hexdocs.pm/elixir/List.html#pop_at/3