在Elixir中,如何将范围转换为列表?
我可以按如下方式声明一个范围:在Elixir中,如何将范围转换为列表?,elixir,Elixir,我可以按如下方式声明一个范围: range = 1..10 有没有办法将范围转换为列表?使用Enum.map/2 range = 1..10 Enum.map(range, fn(x) -> x end) 或 Enum.to_list/1是您要查找的: iex(3)> Enum.to_list 1..10 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 将可枚举项转换为特定集合的通用方法是Enum.into: Enum.into 1..10, [] #=>
range = 1..10
有没有办法将范围转换为列表?使用
Enum.map/2
range = 1..10
Enum.map(range, fn(x) -> x end)
或
Enum.to_list/1
是您要查找的:
iex(3)> Enum.to_list 1..10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
将可枚举项转换为特定集合的通用方法是
Enum.into
:
Enum.into 1..10, []
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
还可以将转换函数作为第三个参数传递:
Enum.into 1..10, %{}, &({&1, &1})
#=> %{1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10}
使用管道操作符
1..10 |> Enum.to_list
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
然后,您可以对其应用进一步的转换,如
1..10 |> Enum.to_list |> Enum.sum
55
这里有一个微基准,比较了前面答案中的方法
defmodule RangeToListBench do
use Benchfella
@test_range 1..1000
bench "Enum.map", do: Enum.map(@test_range, &(&1))
bench "Enum.to_list", do: Enum.to_list(@test_range)
bench "Enum.into", do: Enum.into(@test_range, [])
end
以下是我在2017年MacBook Pro上获得的@test\u range
设置为1..1000
:
benchmark nam iterations average time
Enum.to_list 100000 21.97 µs/op
Enum.into 100000 23.72 µs/op
Enum.map 50000 34.72 µs/op
如果1..100_000
的范围更大,则相对顺序保持不变:
Enum.to_list 1000 2427.21 µs/op
Enum.into 1000 2540.62 µs/op
Enum.map 500 3414.07 µs/op
这同样适用于更小范围的1..10
:
Enum.to_list 10000000 0.32 µs/op
Enum.into 10000000 0.32 µs/op
Enum.map 10000000 0.45 µs/op
TL;DR:
Enum.to_list/1
可能是最有效的选择。这比我的答案还要好。:)这是最快的方法(至少在我的机器上)。下面是我的电脑中的微基准点。
Enum.to_list 10000000 0.32 µs/op
Enum.into 10000000 0.32 µs/op
Enum.map 10000000 0.45 µs/op