Список строк для сопоставления

#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 вместо этого.