elixir - 如何获取除列表中最后一个元素之外的所有元素?

时间:2016-03-26 08:22:21

标签: elixir

假设我有一个列表<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context=".Main.MainActivity" tools:showIn="@layout/activity_main"> <android.support.v4.view.ViewPager android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/viewPager" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> </RelativeLayout>

如何获取此列表中除最后一个之外的所有元素?所以,我会[1, 2, 3, 4]

6 个答案:

答案 0 :(得分:26)

像这样使用Enum.drop / 2:

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

答案 1 :(得分:17)

我的解决方案(我认为它不干净,但它有效!)

a = [1, 2, 3, 4]
[head | tail] = Enum.reverse(a)
Enum.reverse(tail) # [1, 2, 3]

答案 2 :(得分:2)

除了前面提到的list |> Enum.reverse |> tl |> Enum.reverse之外的另一个选项是Erlang的:lists.droplast函数,根据文档的说法,它的速度较慢,但​​由于它没有创建两个新列表,因此产生的垃圾更少。根据您的使用情况,可能是一个有趣的用例。

答案 3 :(得分:1)

如果您希望同时获得最后一项和列表中的其余项,您现在可以使用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

答案 4 :(得分:0)

另一个选择,虽然不优雅,但是 -

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

答案 5 :(得分:0)

Erlang

List = [1,2,3,4,5],
NewList = DropLast(List).

DropLast(List) while length(List) > 0 and is_list(List) ->
    {NewList, _} = lists:split(OldList, length(OldList)-1),
    NewList.