我怎么能在灵药中加倍列表?

asi*_*niy 2 elixir

我有一份清单

[1, 4, 3]
Run Code Online (Sandbox Code Playgroud)

我想繁殖它,比如:

[1, 4, 3] * 3 # => [1, 4, 3, 1, 4, 3, 1, 4, 3]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Ale*_*kin 7

我相信,Elixir惯用解决方案将是使用 List.duplicate/2

list |> List.duplicate(3) |> List.flatten
Run Code Online (Sandbox Code Playgroud)

请注意,如果list预计会有嵌套列表,并且它们不会被展平,则应使用:

list |> List.duplicate(3) |> :lists.concat
Run Code Online (Sandbox Code Playgroud)

- 积分去@Dogbert


Dog*_*ert 5

Enum.map:lists.concat(Enum.concat比慢得多:lists.concat):

:lists.concat(Enum.map(1..100, fn(_) -> @list end))
Run Code Online (Sandbox Code Playgroud)

以下是此主题中的建议和我的其他一些尝试的一些基准:

defmodule BasicBench do
  use Benchfella

  @list Enum.to_list(1..100)

  bench "1 by @asiniy" do
    Enum.reduce(1..100, [], fn(_, acc) -> acc ++ @list end)
  end

  bench "2 by @radubogdan" do
    Enum.take(Stream.cycle(@list), 10000)
  end

  bench "3 by @Dogbert" do
    Enum.flat_map(1..100, fn(_) -> @list end)
  end

  bench "4 by @Dogbert" do
    Enum.concat(Enum.map(1..100, fn(_) -> @list end))
  end

  bench "5 by @Dogbert" do
    :lists.concat(Enum.map(1..100, fn(_) -> @list end))
  end

  bench "6 by @mudasobwa" do
    @list |> List.duplicate(100) |> List.flatten
  end

  bench "7 by @mudasobwa + @Dogbert" do
    :lists.concat(List.duplicate(@list, 100))
  end
end
Run Code Online (Sandbox Code Playgroud)

输出:

benchmark name              iterations   average time
7 by @mudasobwa + @Dogbert       50000   35.72 µs/op
5 by @Dogbert                    50000   38.92 µs/op
6 by @mudasobwa                  10000   124.30 µs/op
3 by @Dogbert                    10000   174.63 µs/op
4 by @Dogbert                    10000   242.24 µs/op
2 by @radubogdan                  2000   924.04 µs/op
1 by @asiniy                      1000   2143.24 µs/op
Run Code Online (Sandbox Code Playgroud)