要映射的字符串列表
List of String to Map
我想转换我从 .txt 文件中拆分出来的这组列表:
["a: 1", "b: 2", "c: 3"]
至:
%{"a" => "1", "b" => "2", "c" => "3"}
for item <- ["a: 1", "b: 2", "c: 3"], into: %{} do
[k, v] = String.split(item, ": ")
{k, v}
end
# %{"a" => "1"}, %{"b" => "2"}, %{"c" => "3"}
最快的方法是使用通用reduce/2
:
list = ["a: 1", "b: 2", "c: 3"]
Enum.reduce(list, %{}, fn <<a::binary-size(1)>> <> ": " <> <<b::binary-size(1)>>, acc -> Map.put(acc, a, b) end)
或者另一种方法是使用 into/2
:
Enum.into(list, %{}, fn <<a::binary-size(1)>> <> ": " <> <<b::binary-size(1)>> -> {a, b} end)
出于好奇:
list = ["a: 1", "b: 2", "c: 3"]
<<?%, ?{, Enum.join(list, ",") :: binary, ?}>>
|> Code.eval_string()
|> elem(0)
#⇒ %{a: 1, b: 2, c: 3}
请注意,当输入对同一键有多个值时,转换为地图注定失败:
list = ["a: 1", "a: 2", "a: 3"]
<<?%, ?{, Enum.join(list, ",") :: binary, ?}>>
|> Code.eval_string()
|> elem(0)
#⇒ %{a: 3}
这就是为什么最好将输入转换为 Keyword
。
一般来说,首先应该将产生这种奇怪输入的代码修改为 return a Keyword
。
我想转换我从 .txt 文件中拆分出来的这组列表:
["a: 1", "b: 2", "c: 3"]
至:
%{"a" => "1", "b" => "2", "c" => "3"}
for item <- ["a: 1", "b: 2", "c: 3"], into: %{} do
[k, v] = String.split(item, ": ")
{k, v}
end
# %{"a" => "1"}, %{"b" => "2"}, %{"c" => "3"}
最快的方法是使用通用reduce/2
:
list = ["a: 1", "b: 2", "c: 3"]
Enum.reduce(list, %{}, fn <<a::binary-size(1)>> <> ": " <> <<b::binary-size(1)>>, acc -> Map.put(acc, a, b) end)
或者另一种方法是使用 into/2
:
Enum.into(list, %{}, fn <<a::binary-size(1)>> <> ": " <> <<b::binary-size(1)>> -> {a, b} end)
出于好奇:
list = ["a: 1", "b: 2", "c: 3"]
<<?%, ?{, Enum.join(list, ",") :: binary, ?}>>
|> Code.eval_string()
|> elem(0)
#⇒ %{a: 1, b: 2, c: 3}
请注意,当输入对同一键有多个值时,转换为地图注定失败:
list = ["a: 1", "a: 2", "a: 3"]
<<?%, ?{, Enum.join(list, ",") :: binary, ?}>>
|> Code.eval_string()
|> elem(0)
#⇒ %{a: 3}
这就是为什么最好将输入转换为 Keyword
。
一般来说,首先应该将产生这种奇怪输入的代码修改为 return a Keyword
。