#elixir
#elixir
Вопрос:
Я хочу преобразовать этот набор списков, который я разделил из файла .txt:
["a: 1", "b: 2", "c: 3"]
Для:
%{"a" => "1", "b" => "2", "c" => "3"}
Ответ №1:
for item <- ["a: 1", "b: 2", "c: 3"], into: %{} do
[k, v] = String.split(item, ": ")
{k, v}
end
# %{"a" => "1"}, %{"b" => "2"}, %{"c" => "3"}
Комментарии:
1.
List.to_tuple/1
:for ..., do: item |> String.split(": ") |> List.to_tuple()
.
Ответ №2:
Самый быстрый способ — использовать универсальный 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)
Ответ №3:
Просто из любопытства:
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
в .
В общем, вероятно, следует изменить код, который производит этот странный ввод, чтобы Keyword
в первую очередь возвращать a вместо этого.