List Erlang多对多列表重建

List Erlang多对多列表重建,list,erlang,List,Erlang,我需要解析很多关系 我的清单如下: [ {item1, [rel1, rel2, rel3]}, {item2, [rel2, rel5]}, {item3, [rel1, rel4]}, ... ] I need to build new list like: [ {rel1, [item1, item3]}, {rel2, [item1, item2]}, ... ] 我如何才能有效地完成它?使用dict最有效的方法: D = dict:from_list(INPUT),

我需要解析很多关系

我的清单如下:

[
 {item1, [rel1, rel2, rel3]},
 {item2, [rel2, rel5]},
 {item3, [rel1, rel4]}, 
 ...
]

I need to build new list like:
[
 {rel1, [item1, item3]},
 {rel2, [item1, item2]},
 ...
]

我如何才能有效地完成它?

使用dict最有效的方法:

D = dict:from_list(INPUT),
F = fun(K,V,ACC) ->
        dict:update(V, fun(X) -> [K|X] end, [X], ACC)
    end
D2 = dict:fold(F, dict:new(), D),
OUTPUT = dict:to_list(D2).
F = fun({Item,Rels}, Dict) ->
  H = fun(L) -> [Item|L] end,
  G = fun(Rel, D) -> dict:update(Rel, H, [Item], D) end,
  lists:foldl(G, Dict, Rels)
end,
dict:to_list(lists:foldl(F, dict:new(), Input)).
由于GC压力较小,使用ets可以更快地处理真正的大数据:

Tab = ets:new(ok, [private]),
[ ets:insert(Tab,
  {Rel, case ets:lookup(Tab, Rel) of
      [] -> [Item];
      [{_, L}] -> [Item|L]
    end})
  || {Item, Rels} <- Input, Rel <- Rels ],
Result = ets:tab2list(Tab),
ets:delete(Tab),
Result.

使用dict的最有效方法:

F = fun({Item,Rels}, Dict) ->
  H = fun(L) -> [Item|L] end,
  G = fun(Rel, D) -> dict:update(Rel, H, [Item], D) end,
  lists:foldl(G, Dict, Rels)
end,
dict:to_list(lists:foldl(F, dict:new(), Input)).
由于GC压力较小,使用ets可以更快地处理真正的大数据:

Tab = ets:new(ok, [private]),
[ ets:insert(Tab,
  {Rel, case ets:lookup(Tab, Rel) of
      [] -> [Item];
      [{_, L}] -> [Item|L]
    end})
  || {Item, Rels} <- Input, Rel <- Rels ],
Result = ets:tab2list(Tab),
ets:delete(Tab),
Result.