Elixir 有没有更简单的方法来获取与函数匹配的列表中的第一个项,然后返回该项以及不包含该项的列表?

Elixir 有没有更简单的方法来获取与函数匹配的列表中的第一个项,然后返回该项以及不包含该项的列表?,elixir,Elixir,示例:我们有一个列表[1,2,3,4],还有一个fn&(&1>=3)我想拿回3,和[1,2,4] 目前我的做法是: index = Enum.find_index(list, func) elem = Enum.at(list, index) rest = List.delete_at(list, index) 这是3行代码,看起来像是一个可以缩短的常见模式。有没有更好的方法来实现类似的功能?假设只有一个元素与您的函数匹配,您可以使用split\u和+模式匹配: iex(1)> {[it

示例:我们有一个列表
[1,2,3,4]
,还有一个fn
&(&1>=3)
我想拿回
3
,和
[1,2,4]

目前我的做法是:

index = Enum.find_index(list, func)
elem = Enum.at(list, index)
rest = List.delete_at(list, index)

这是3行代码,看起来像是一个可以缩短的常见模式。有没有更好的方法来实现类似的功能?

假设只有一个元素与您的函数匹配,您可以使用
split\u和
+模式匹配:

iex(1)> {[item], rest} = Enum.split_with([1,2,3,4], & &1 == 3)
{[3], [1, 2, 4]}
iex(2)> item
3
iex(3)> rest
[1, 2, 4]

当然,如果列表中有超过1个匹配项,则此操作将崩溃。如果您只想提取第一个元素,您可以
{[item |,rest}
,但这仍然会从
rest
中删除所有元素,因此我不确定这是否是您想要的。

假设正好有一个元素与您的函数匹配,您可以使用
split与
+模式匹配:

iex(1)> {[item], rest} = Enum.split_with([1,2,3,4], & &1 == 3)
{[3], [1, 2, 4]}
iex(2)> item
3
iex(3)> rest
[1, 2, 4]

当然,如果列表中有超过1个匹配项,则此操作将崩溃。如果您只想提取第一个,您可以
{[item |,rest}
,但这仍然会从
rest
中删除所有这些,因此我不确定这是否是您想要的。

要完成所述任务(仅拆分到第一次出现),请使用始终有效的大锤:

input=[1,2,3,4]
输入
|>带有_索引()的枚举
|>Enum.reduce_while({nil,[]},fn{e,idx},{value,rest}->
如果e>=3,
do:{:halt,{e,Enum.reverse(rest)++tl(Enum.slice(input,idx..-1))},
其他:{:cont,{value,[e | rest]}}end)
#⇒ {3, [1, 2, 4]}
这里只需要使用带有索引的
技巧来提高性能。一旦找到元素,我们希望立即停止迭代,因此我们需要下一个元素的索引,以便将尾部批量添加到结果中


另一种方法是使用

带{h[e|t]}非(x>=3)端),
do:{e,h++t}
#⇒ {3, [1, 2, 4]}

要完成所述任务(仅拆分为第一次出现),请使用始终有效的大锤:

input=[1,2,3,4]
输入
|>带有_索引()的枚举
|>Enum.reduce_while({nil,[]},fn{e,idx},{value,rest}->
如果e>=3,
do:{:halt,{e,Enum.reverse(rest)++tl(Enum.slice(input,idx..-1))},
其他:{:cont,{value,[e | rest]}}end)
#⇒ {3, [1, 2, 4]}
这里只需要使用带有索引的
技巧来提高性能。一旦找到元素,我们希望立即停止迭代,因此我们需要下一个元素的索引,以便将尾部批量添加到结果中


另一种方法是使用

带{h[e|t]}非(x>=3)端),
do:{e,h++t}
#⇒ {3, [1, 2, 4]}