我想从列表a中删除列表b中的元素.列表a在执行此代码后打印[1,2,3,4].
defmodule Test do
def listing do
a = [1,2,3,4]
b = [3,4,5,6]
Enum.each b, fn elemB ->
a = Enum.filter(a, fn(x) -> x != elemB == true end)
#IO.inspect a
end
IO.inspect a
end
end
Test.listing()
Run Code Online (Sandbox Code Playgroud)
Mik*_*hot 10
您也可以使用--运算符(https://hexdocs.pm/elixir/Kernel.html#--/2)
iex> [1, 2, 3] -- [1, 2]
[3]
Run Code Online (Sandbox Code Playgroud)
目前(Enum.filter和--)在其他答案中呈现的两种方式都适用于小型列表.但是,列表很大,效率很低.
如果列表很大,最好使用MapSet:
MapSet.difference(MapSet.new(a), MapSet.new(b)) |> MapSet.to_list
Run Code Online (Sandbox Code Playgroud)
它花了一些时间将两个列表转换为MapSet,然后将结果转换回列表,但这些操作是n log(n),而这里的Enum.filtersubstraction(--)是二次的.
总结:对于非常短的列表减法是最快的,对于大约100个元素长的列表Enum.filter是最快的,并且对于列表大约1000个元素MapSet.difference是最快的.在具有100K元素的列表上,它快了几百倍.
实际上,在列表上,此大小的MapSet.difference工作时间为0.08秒,Enum.filter16秒和减法44秒.
更新:Dogbert让我也对Erlang进行基准测试ordsets:
:ordsets.subtract(:ordsets.from_list(a), :ordsets.from_list(b)) |> :ordsets.to_list
Run Code Online (Sandbox Code Playgroud)
它的工作速度比MapSet,特别是在中型列表上长约1000条记录(MapSet大约1.4慢一点).
| 归档时间: |
|
| 查看次数: |
1913 次 |
| 最近记录: |