当前位置:  开发笔记 > 编程语言 > 正文

Elixir:使用整数键将列表转换为地图

如何解决《Elixir:使用整数键将列表转换为地图》经验,为你挑选了1个好方法。

你如何从列表中走出来: ~w[dog cat sheep]

到具有整数键的地图: %{1=> "dog", 2=> "cat", 3=> "sheep"}

我的尝试:

iex(1)> list = ~w[dog cat sheep]
["dog", "cat", "sheep"]
iex(2)> list |> Enum.with_index|>Enum.map(fn({a,b})->{b+1,a} end)|> Enum.into %{}

%{1=> "dog", 2=> "cat", 3=> "sheep"}

有更简单的方法吗?



1> potatosalad..:

这是一个单行版本:

for {v, k} <- ~w[dog cat sheep] |> Enum.with_index, into: %{}, do: {k+1, v}

这与模块中的可重用函数相同:

defmodule Example do
  def to_indexed_map(list, offset \\ 0)
      when is_list(list)
      and is_integer(offset),
    do: for {v, k} <- list |> Enum.with_index,
      into: %{},
      do: {k+offset, v}
end

用法示例:

iex> list = ~w[dog cat sheep]
["dog", "cat", "sheep"]
iex> Example.to_indexed_map(list)
%{0 => "dog", 1 => "cat", 2 => "sheep"}

次要更新:不太简洁,但性能更高的版本(大约快2倍)如下所示.

defmodule Example do
  def to_indexed_map(list, offset \\ 0)
      when is_list(list)
      and is_integer(offset),
    do: to_indexed_map(list, offset, [])

  defp to_indexed_map([], _k, acc),
    do: :maps.from_list(acc)
  defp to_indexed_map([v | vs], k, acc),
    do: to_indexed_map(vs, k+1, [{k, v} | acc])
end

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有