将列表列表转换为元组列表的最佳方法是什么?

时间:2015-05-30 12:09:14

标签: erlang erlang-shell erlang-escript

[[1,2,3],[a,b,c],[4,5,6]]等列表转换为这样的元组列表的最佳方法是什么:

[{1,a,4},{2,b,5},{3,c,6}]

哪里元组N由三个子列表中的每一个的第N个元素组成?我应该使用尾递归函数,列表推导还是其他方法吗?

4 个答案:

答案 0 :(得分:7)

只需使用标准lists:zip3/3功能:

1> [L1,L2,L3] = [[1,2,3],[a,b,c],[4,5,6]].
[[1,2,3],[a,b,c],[4,5,6]]
2> lists:zip3(L1,L2,L3).
[{1,a,4},{2,b,5},{3,c,6}]

或者,如果您希望避免提取单个列表:

3> apply(lists, zip3, [[1,2,3],[a,b,c],[4,5,6]]).
[{1,a,4},{2,b,5},{3,c,6}]

答案 1 :(得分:4)

我更喜欢你的案例列表理解,因为:

  • 这是一段简短的代码,易于阅读,
  • 它不需要辅助函数,因此完成的操作清晰可见。

    L_of_tuple = [list_to_tuple(X) || X <- L_of_list].

如果必须在很多地方进行这种转换,最好将它写在一个单独的函数中,然后任何解决方案(甚至小心递归都是谨慎的)对我有好处。

答案 2 :(得分:1)

一个优雅的解决方案可以是

lol2lot([[]|_]) -> [];
lol2lot(LoL) ->
    [ list_to_tuple([hd(L) || L <- LoL]) | lol2lot([tl(L) || L <- LoL]) ].

答案 3 :(得分:0)

例如:

L =  [[1,2,3],[a,b,c],[4,5,6]].
Size = length(L).
T = [fun(I)->list_to_tuple([lists:nth(I,lists:nth(J,L)) ||J<-lists:seq(1,Size)]) end(I) || I<-lists:seq(1,Size)].