代码之家  ›  专栏  ›  技术社区  ›  Bitwise

从列表中删除多个元素

  •  3
  • Bitwise  · 技术社区  · 7 年前

    鉴于此列表:

    list = [1,2,3,4,5]
    

    如何返回包含这些元素的新列表?

    [3,4,5]
    

    我知道我用 List.delete/2 但据我所知,一次只能删除一个元素。我想一下子去掉前两个元素。

    3 回复  |  直到 7 年前
        1
  •  5
  •   DarckBlezzer RichieHindle    7 年前

    我想你在找这个

    # Example with static values
    iex> [1, 2, 3, 4, 5] -- [1, 2]
    [3, 4, 5]
    
    # Example with Enum.drop/2, with multiple values
    iex> Enum.drop([1, 2, 3, 4, 5], 2)
    [3, 4, 5]
    iex> Enum.drop([1, 2, 3, 4, 5], -2)
    [1, 2, 3]
    iex> Enum.drop([1, 2, 3, 4, 5], 20)
    []
    iex> Enum.drop([1, 2, 3, 4, 5], -20)
    []
    

    你可以用 List.delete/2 一次只能删除一个 Enum.drop/2 是否可以删除多个取决于您如何使用它。

        2
  •  2
  •   Adam Millerchip    7 年前

    如果要基于某些任意条件删除元素,可以使用 Enum.reject/2 ,并提供拒绝条件作为参数。

    iex(1)> Enum.reject([1,2,3,4,5], fn x -> x in [1,2] end)
    [3, 4, 5]
    
        3
  •  1
  •   Nathan Ripert Guillaume Milan    7 年前

    要仅提取前2个元素:可以这样进行模式匹配:

    [_,_|sublist] = list
    

    你也可以使用 tl/1

    list |> tl() |> tl ()
    

    然而,这最后的解决方案并不能一下子做到这一点。

    如果要删除的元素数量不同,我看不到@Dogbert建议的另一种解决方案:使用 Enum.drop/2 ,或者 Enum.split/2

    {_,sublist} = Enum.split(list,2)
    
        4
  •  1
  •   Bitwise    7 年前

    Enum.filter/2

    它看起来像这样:

    Enum.filter(list, &(&1 >= 3))
    
    => [3,4,5]