不仅删除Elixir中列表的第一个元素

时间:2018-08-25 13:08:25

标签: list elixir removing-whitespace

是否可以删除Elixir中列表元素的所有条目?我发现List.delete/2,仅删除搜索到的第一个条目。我一直在寻找可以删除所有条目的东西,例如

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

[:b, :c]

有没有类似的东西?也许像List.delete_all/2

4 个答案:

答案 0 :(得分:4)

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

给予

[:b, :c]

答案 1 :(得分:2)

您正在寻找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]

更粗俗的方法是使用递归:

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]

答案 2 :(得分:2)

您还可以将comprehensions与过滤器一起使用:

for tr in table.find_all("tr"):
  for key,value in enumerate(tr.find_all("td")):
    anchor = value.find_all("a",class="Lcc")
      if "Retained Profit PS" in anchor.text:
        return  tr.find_all("td")[key+1]

或者使用防护罩代替过滤器:

iex(1)> for x <- [:a, :b, :c, :a, :a], x !== :a, do: x
[:b, :c]

答案 3 :(得分:-1)

list = list -- list

这将删除列表中的所有元素,列表将为空 - []