将列表列表转换为元组列表的最佳方法?
Best way to convert list of lists to list of tuples?
将诸如 [[1,2,3],[a,b,c],[4,5,6]]
的列表转换为这样的元组列表的最佳方法是什么:
[{1,a,4},{2,b,5},{3,c,6}]
其中元组 N 由三个子列表中的第 N 个元素组成?我应该使用尾递归函数、列表理解还是其他一些方法?
我更喜欢你的案例列表理解,因为:
- 很短的一行代码,易于阅读,
不需要辅助函数,操作一目了然
L_of_tuple = [list_to_tuple(X) || X <- L_of_list].
如果要在很多地方做这个转换,最好写在一个单独的函数中,然后任何解决方案(甚至 body 递归慎用)对我来说都是好的。
例如:
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)].
只需使用标准 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}]
一个优雅的解决方案可以是
lol2lot([[]|_]) -> [];
lol2lot(LoL) ->
[ list_to_tuple([hd(L) || L <- LoL]) | lol2lot([tl(L) || L <- LoL]) ].
将诸如 [[1,2,3],[a,b,c],[4,5,6]]
的列表转换为这样的元组列表的最佳方法是什么:
[{1,a,4},{2,b,5},{3,c,6}]
其中元组 N 由三个子列表中的第 N 个元素组成?我应该使用尾递归函数、列表理解还是其他一些方法?
我更喜欢你的案例列表理解,因为:
- 很短的一行代码,易于阅读,
不需要辅助函数,操作一目了然
L_of_tuple = [list_to_tuple(X) || X <- L_of_list].
如果要在很多地方做这个转换,最好写在一个单独的函数中,然后任何解决方案(甚至 body 递归慎用)对我来说都是好的。
例如:
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)].
只需使用标准 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}]
一个优雅的解决方案可以是
lol2lot([[]|_]) -> [];
lol2lot(LoL) ->
[ list_to_tuple([hd(L) || L <- LoL]) | lol2lot([tl(L) || L <- LoL]) ].