Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Elixir中的索引同时从列表中删除多个项目?_Elixir - Fatal编程技术网

如何通过Elixir中的索引同时从列表中删除多个项目?

如何通过Elixir中的索引同时从列表中删除多个项目?,elixir,Elixir,以下是我试图实现的目标: > a = ["a","b","c","d","e"] > Enum.reject_multiple(a,[1,3]) ["a", "c", "e"] 我能想到的最清楚的方法是包括索引,并拒绝所需的项目 rejected_index=MapSet.new([1,3]) [“a”、“b”、“c”、“d”、“e”] |>Stream.with_index() |>Stream.reject(fn{{u item,index}->index in reject

以下是我试图实现的目标:

> a = ["a","b","c","d","e"] 
> Enum.reject_multiple(a,[1,3])
["a", "c", "e"]

我能想到的最清楚的方法是包括索引,并拒绝所需的项目

rejected_index=MapSet.new([1,3])
[“a”、“b”、“c”、“d”、“e”]
|>Stream.with_index()
|>Stream.reject(fn{{u item,index}->index in rejected\ u index end)
|>枚举映射(&elem(&1,0))
#=>[“a”、“c”、“e”]

虽然@BrettBeatty肯定提供了正确的方法,但我想发布一个示例,说明如何使用一些元编程魔法,通过单次遍历列表来实现。只是为了以身作则

defmodule MyEnum do
定义宏抽取(列表、索引)do
引述
取消报价(列表)
|>Enum.reduce({0,[]},fn
_,{i,acc}当i在unquote(索引)->{i+1,acc}
e、 {i,acc}->{i+1[e|acc]}
(完)
|>要素(1)
|>Enum.reverse()
结束
结束
结束
需要髓鞘
MyEnum.decimate(~w[abcde],[1,3])
#⇒[“a”、“c”、“e”]
需要宏才能将
索引
置于保护中。

旁注:通过将其包装在宏中,可以使
索引
成为保护表达式,这可能会提高性能,有关详细信息,请参阅我的答案。是的,我知道,这是一个过早的优化,在99%的情况下不需要:)