删除 Elixir 中列表元素的所有条目(不仅仅是第一个)

gme*_*die 2 list elixir removing-whitespace

我发现 List.delete/2,这只删除搜索到的第一个条目。我一直在寻找删除所有条目的东西,例如

[:a, :b, :c, :a, :a]
|> List.delete_all :a

[:b, :c]
Run Code Online (Sandbox Code Playgroud)

有这样的事吗?也许像List.delete_all/2

Gav*_*aff 5

[:a, :b, :c, :a, :a] |> Enum.reject( fn x -> x == :a end )
Run Code Online (Sandbox Code Playgroud)

给出

[:b, :c]
Run Code Online (Sandbox Code Playgroud)


Ale*_*kin 5

您正在寻找Enum.reject/2

\n\n\n\n
Enum.reject(~w|a b c a a|a, & &1 == :a)\n#\xe2\x87\x92 [:b, :c]\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

旁注: Elixir 核心团队认为使用管道进行单一操作是一种反模式。

\n\n
\n\n

另一种(更灵活)的可能性是使用Enum.reduce/3

\n\n
~w|a b c a a|a\n|> Enum.reduce([],\n     &(if &1 == :a, do: &2, else: [&1 | &2]))\n|> :lists.reverse()\n#\xe2\x87\x92\xc2\xa0[:b, :c]\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

更爱尔兰式(也更优雅)的方法是使用递归:

\n\n
defmodule M do\n  def get_rid_of(e, list, acc \\\\ [])\n  def get_rid_of(_, [], acc),\n    do: :list.reverse(acc)\n  def get_rid_of(e, [e | rest], acc),\n    do: get_rid_of(e, rest, acc)\n  def get_rid_of(e, [o | rest], acc),\n    do: get_rid_of(e, rest, [o | acc])\nend\nM.get_rid_of :a, ~w|a b c a a|a\n#\xe2\x87\x92 [:b, :c]\n
Run Code Online (Sandbox Code Playgroud)\n