list - Elixir:将列表转换为具有整数键的映射

标签 list dictionary zip elixir

如何从一个列表中去:~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"}

有没有更简单的方法?

最佳答案

这是单行版本:

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

关于list - Elixir:将列表转换为具有整数键的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34076595/

相关文章:

python - 在 Django 模板中呈现列表

python - 在 Python 的列表中使用 abs()

python - 根据已定义的字典/顺序将列表映射为字典值

python - 检查变量是否为列表的最佳方法是什么?

javascript - 如何在 zip 文件存档器中创建文件夹 - node.js

java - 这种 zip 方法有什么问题吗?

bash - 使用 bash 脚本在 hadoop 中压缩不同的目录

java - 通用列表属性,获取通用类型

java - 如何在 Java 类中实现 Collection 字段的 getter/setter?

Java:非空方法作为映射值