【问题标题】:In Elixir, how can a range be converted to a list?在 Elixir 中,如何将范围转换为列表?
【发布时间】:2020-01-14 05:20:05
【问题描述】:

我可以如下声明一个范围:

range = 1..10

有没有办法将范围转换为列表?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    Enum.to_list/1 就是你要找的东西:

    iex(3)> Enum.to_list 1..10
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    【讨论】:

    • 这比我的回答还要好。 :)
    • 这是最快的方法(至少在我的机器上)。在我下面的answer 中进行微基准测试。
    【解决方案2】:

    将枚举转换为特定收藏的通用方法是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}
    

    【讨论】:

      【解决方案3】:

      使用Enum.map/2

      range = 1..10
      Enum.map(range, fn(x) -> x end)
      

      或

      Enum.map(range, &(&1))
      

      【讨论】:

        【解决方案4】:

        使用管道运算符

        1..10 |> Enum.to_list
        
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        

        然后您可以对其应用进一步的转换,例如

        1..10 |> Enum.to_list |> Enum.sum
        
        55
        

        【讨论】:

          【解决方案5】:

          这是一个Benchfella 微基准测试,比较了之前答案中的方法。

          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_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 可能是最有效的选择。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-13
            • 2017-10-02
            • 1970-01-01
            • 2011-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-05
            相关资源
            最近更新 更多