【问题标题】:elixir - how to get all elements except last in the list?elixir - 如何获取列表中除最后一个以外的所有元素?
【发布时间】:2018-09-16 11:29:27
【问题描述】:

假设我有一个列表[1, 2, 3, 4]

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

    像这样使用 Enum.drop/2:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 它可能不直观,但基于快速测试,它是最有效的。 gist.github.com/ckhrysze/015a8748910c8d467bd2a6e2c832a670 ## PopBench 反向 500000 6.64 µs/op drop 500000 6.73 µs/op take 100000 26.07 µs/op
      • 实际上这是在许多 Enum 函数的实现中非常常见的模式。 Erlang 中有一个优化的 :list.reverse ,在减少后使用它会为您提供所需的列表,但与您想要的顺序相反。
      【解决方案3】:

      如果您希望同时获取最后一项和前面的列表的其余部分,您现在可以使用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】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            二郎

            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.
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-12-13
              • 1970-01-01
              • 2022-07-11
              • 1970-01-01
              • 1970-01-01
              • 2012-01-11
              • 2010-10-30
              相关资源
              最近更新 更多