将嵌套列表转换为元组列表

时间:2009-11-30 21:08:23

标签: erlang

我有以下列表

["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 个答案:

答案 0 :(得分:4)

KVL = [begin [K,V]=string:tokens(T,"="), {list_to_atom(K), V} end || T <- L]. 

答案 1 :(得分:2)

对于从这个问题中提示的其他人的一点免责声明。使用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攻击。唯一原子表最大可达1600万个原子。

此外,令牌会在字符串中分割每个等号。不仅仅是在第一个分裂上更好吗?

答案 2 :(得分:1)

我终于让它终于工作了!

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"}]

答案 3 :(得分:1)

更短:

KVL = [{list_to_atom(K), V} || [K,V] <- [string:tokens(T,"=") || T <- L]].