删除 Elixir 中列表元素的所有条目(不仅仅是第一个)
Delete all entries of an element of a list in Elixir (not just the first one)
我发现 List.delete/2
,它只删除搜索到的第一个条目。我一直在寻找可以删除所有条目的东西,例如
[:a, :b, :c, :a, :a]
|> List.delete_all :a
[:b, :c]
有这样的吗?也许像 List.delete_all/2
[:a, :b, :c, :a, :a] |> Enum.reject( fn x -> x == :a end )
给予
[:b, :c]
您正在寻找Enum.reject/2
Enum.reject(~w|a b c a a|a, & &1 == :a)
#⇒ [:b, :c]
旁注:使用管道进行单个操作被 Elixir 核心团队认为是一种反模式。
另一种(更灵活)的可能性是使用 Enum.reduce/3
:
~w|a b c a a|a
|> Enum.reduce([],
&(if &1 == :a, do: &2, else: [&1 | &2]))
|> :lists.reverse()
#⇒ [:b, :c]
更 erlangish(和优雅)的方法是使用递归:
defmodule M do
def get_rid_of(e, list, acc \ [])
def get_rid_of(_, [], acc),
do: :list.reverse(acc)
def get_rid_of(e, [e | rest], acc),
do: get_rid_of(e, rest, acc)
def get_rid_of(e, [o | rest], acc),
do: get_rid_of(e, rest, [o | acc])
end
M.get_rid_of :a, ~w|a b c a a|a
#⇒ [:b, :c]
您还可以将 comprehensions 与过滤器一起使用:
iex(1)> for x <- [:a, :b, :c, :a, :a], x !== :a, do: x
[:b, :c]
或者使用守卫代替过滤器:
iex(2)> for x when x !== :a <- [:a, :b, :c, :a, :a], do: x
[:b, :c]
list = list -- list
这将删除列表中的所有元素,列表将为空 - []
我发现 List.delete/2
,它只删除搜索到的第一个条目。我一直在寻找可以删除所有条目的东西,例如
[:a, :b, :c, :a, :a]
|> List.delete_all :a
[:b, :c]
有这样的吗?也许像 List.delete_all/2
[:a, :b, :c, :a, :a] |> Enum.reject( fn x -> x == :a end )
给予
[:b, :c]
您正在寻找Enum.reject/2
Enum.reject(~w|a b c a a|a, & &1 == :a)
#⇒ [:b, :c]
旁注:使用管道进行单个操作被 Elixir 核心团队认为是一种反模式。
另一种(更灵活)的可能性是使用 Enum.reduce/3
:
~w|a b c a a|a
|> Enum.reduce([],
&(if &1 == :a, do: &2, else: [&1 | &2]))
|> :lists.reverse()
#⇒ [:b, :c]
更 erlangish(和优雅)的方法是使用递归:
defmodule M do
def get_rid_of(e, list, acc \ [])
def get_rid_of(_, [], acc),
do: :list.reverse(acc)
def get_rid_of(e, [e | rest], acc),
do: get_rid_of(e, rest, acc)
def get_rid_of(e, [o | rest], acc),
do: get_rid_of(e, rest, [o | acc])
end
M.get_rid_of :a, ~w|a b c a a|a
#⇒ [:b, :c]
您还可以将 comprehensions 与过滤器一起使用:
iex(1)> for x <- [:a, :b, :c, :a, :a], x !== :a, do: x
[:b, :c]
或者使用守卫代替过滤器:
iex(2)> for x when x !== :a <- [:a, :b, :c, :a, :a], do: x
[:b, :c]
list = list -- list
这将删除列表中的所有元素,列表将为空 - []