从Elixir中的列表中删除最后一个元素?

glu*_*ler 2 phoenix elixir

您如何简单地从本示例的末尾删除20?

[46, 238, 64, 30, 105, 136, 98, 75, 23, 157, 11, 20]
Run Code Online (Sandbox Code Playgroud)

Nat*_*ert 7

我所知道的@mudasobwa最快的解决
方案1

x |> Enum.reverse() |> tl() |> Enum.reverse()
Run Code Online (Sandbox Code Playgroud)

其他一些解决方案:
解决方案2

[k] = Enum.chunk(x, length(x)-1)
Run Code Online (Sandbox Code Playgroud)

解决方案3

List.delete_at(x, length(x)-1)
Run Code Online (Sandbox Code Playgroud)

解决方案4

x |> List.to_tuple() |> Tuple.delete_at(length(x)-1) |> Tuple.to_list
Run Code Online (Sandbox Code Playgroud)

一个更有趣的问题是,如何最快地做到这一点?让我们进行基准测试!

我使用Benchee得到了以下结果,每个解决方案计算了50000次,并且使用了Enum.to_list(1..10_000)

Name                                  ips        average  deviation         median         99th %
mudasobwa's solution              14.80 K       67.57 ?s    ±34.17%          79 ?s          91 ?s
solution 1                        14.79 K       67.59 ?s    ±33.96%          79 ?s          91 ?s
solution 4                        10.71 K       93.38 ?s    ±32.67%          81 ?s         201 ?s
Roman Rabinovich's solution        8.45 K      118.33 ?s    ±18.27%         118 ?s         171 ?s
OneSneakyMofo's solution           5.07 K      197.34 ?s    ±13.60%         193 ?s         331 ?s
dawner's solution                  4.57 K      219.00 ?s    ±11.87%         216 ?s      256.23 ?s
solution 3                         3.41 K      292.91 ?s    ±20.01%         290 ?s      506.64 ?s
solution 2                         0.83 K     1205.52 ?s    ±22.25%        1105 ?s     2061.77 ?s

Comparison: 
mudasobwa's solution              14.80 K
solution 1                        14.79 K - 1.00x slower
solution 4                        10.71 K - 1.38x slower
Roman Rabinovich's solution        8.45 K - 1.75x slower
OneSneakyMofo's solution           5.07 K - 2.92x slower
dawner's solution                  4.57 K - 3.24x slower
solution 3                         3.41 K - 4.33x slower
solution 2                         0.83 K - 17.84x slower
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以这样做:

List.pop_at(x, -1)
{20, [46, 238, 64, 30, 105, 136, 98, 75, 23, 157, 11]}
Run Code Online (Sandbox Code Playgroud)