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

问题描述 投票:0回答:3

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

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

[:b, :c]

有这样的东西吗?也许有这样的东西 List.delete_all/2

list elixir removing-whitespace
3个回答
2
投票

您正在寻找的是 Enum.reject/2

Enum.reject(~w|a b c a a|a, & &1 == :a)
#⇒ [:b, :c]

旁白:使用管道进行单次操作被Elixir核心团队认为是反模式。 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]

更优雅的方法是使用递归。

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]

4
投票
[:a, :b, :c, :a, :a] |> Enum.reject( fn x -> x == :a end )

给出

[:b, :c]

2
投票

您也可以使用 理解力 用过滤器。

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]
© www.soinside.com 2019 - 2024. All rights reserved.