Преобразование вложенных списков в список кортежей - PullRequest
2 голосов
/ 01 декабря 2009

У меня есть следующий список

["txtvers=1","userid=3A6524D4-E31C-491D-94DD-555883B1600A","name=Jarrod Roberson","version=2"]

Я хочу создать Dict, где левая сторона = - это ключ, а правая - это значение. Предпочтительно, когда ключ является атомом.

Используя следующее понимание списка, я получаю это.

 KVL = [string:tokens(T,"=") || T <- TXT].

[["txtvers","1"], ["userid","3A6524D4-E31C-491D-94DD-555883B1600A"], ["name","Jarrod Roberson"], ["version","2"]]

Теперь я борюсь с тем, как преобразовать вложенные списки в кортежи, чтобы я мог отправить их в список кортежей. где я могу отправить их в dict: from_list

я хочу что-то вроде этого

[{txtvers,"1"}, {userid,"3A6524D4-E31C-491D-94DD-555883B1600A"}, {name,"Jarrod Roberson"}, {version,"2"}]

Я знаю, что должен быть лаконичный способ сделать это, но я просто не могу обдумать это.

Ответы [ 4 ]

4 голосов
/ 01 декабря 2009
KVL = [begin [K,V]=string:tokens(T,"="), {list_to_atom(K), V} end || T <- L]. 

;)

2 голосов
/ 01 декабря 2009

Небольшая оговорка о том, что кто-то еще намекает на этот вопрос. Всегда полезно превратить списки в атомы, используя list_to_existing_atom.

split_keyvalue(Str) ->
  try 
    {K, [$=|V]} = lists:splitwith(fun(X) -> X =/= $= end, Str),
    {erlang:list_to_existing_atom(K), V} 
  catch 
     error:badarg -> 
       fail 
  end.

split_keyvalues(List) ->
  [KV || {_,_}=KV <- lists:map(fun split_keyvalue/1, List)].

Причина в том, что возможна DoS-атака, если предоставленные пользователем (злонамеренные) данные могут создать миллионы и миллионы уникальных атомов. Таблица уникальных атомов не более 16 миллионов атомов.

Кроме того, токены разбивают каждый знак равенства в строке. Не лучше ли разделить только на первый?

1 голос
/ 02 декабря 2009

Еще короче:

KVL = [{list_to_atom(K), V} || [K,V] <- [string:tokens(T,"=") || T <- L]].
1 голос
/ 01 декабря 2009

Я наконец-то заставил его работать!

A = [ string:tokens(KV,"=") || KV <- TXT].
[["txtvers","1"],
 ["userid","3A6524D4-E31C-491D-94DD-555883B1600A"],
 ["name","Jarrod Roberson"],
 ["version","2"]]
B = [{list_to_atom(K),V} || [K|[V|_]] <- A].
[{txtvers,"1"},
 {userid,"3A6524D4-E31C-491D-94DD-555883B1600A"},
 {name,"Jarrod Roberson"},
 {version,"2"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...