首页 > 解决方案 > 将列表转换为以前两个字母为索引的映射

问题描述

我有清单:

["AM00", "CC11", "CB11"]

我需要像这样在地图中转换这个列表:

%{"AM" => "00", "CC" => "11", "CB" => "11"}

我尝试使用 Enum.map 但它不起作用:

["AM00", "CC11", "CB11"]
|> Map.new(&Enum.map(&1, fn x -> x end), %{})

标签: elixir

解决方案


二进制模式匹配可以剖析字符串:

   data = ["AM00", "CC11", "CB11"]

   for <<key::binary-size(2), value::binary>> <- data, into: %{} do
     {key, value}
   end

输出:

%{"AM" => "00", "CB" => "11", "CC" => "11"}

这只适用于单字节字符。

要处理UTF-8字符以及ASCII字符:

   data = ["èü00", "C€11", "€ä11"]

   for <<char1::utf8, char2::utf8, rest::binary>> <- data, into: %{} do
    {<<char1::utf8, char2::utf8>>, rest}
   end

输出:

%{"C€" => "11", "èü" => "00", "€ä" => "11"}

推荐阅读