代码之家  ›  专栏  ›  技术社区  ›  user177800

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

  •  2
  • user177800  · 技术社区  · 15 年前

    我有以下清单

    ["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:从\列表

    我想要这样的东西

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

    我知道要做到这一点必须有一个简洁的方法,但我就是无法理解。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Hynek -Pichi- Vychodil Paulo Suassuna    15 年前

    更短:

    KVL = [{list_to_atom(K), V} || [K,V] <- [string:tokens(T,"=") || T <- L]].
    
        2
  •  4
  •   Zed    15 年前
    KVL = [begin [K,V]=string:tokens(T,"="), {list_to_atom(K), V} end || T <- L]. 
    

    ;)

        3
  •  2
  •   Christian    15 年前

    对其他人从这个问题中得到暗示的一个小小的免责声明。使用list-to-u现有的原子把list变成原子总是一个好主意。

    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万个大原子。

    此外,标记还拆分字符串中的每个等号。只在第一个上分开不是更好吗?

        4
  •  1
  •   user177800    15 年前

    我终于成功了!

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