2015-05-30 6 views
5

Какой самый лучший способ, чтобы преобразовать список таких как [[1,2,3],[a,b,c],[4,5,6]] в список кортежей, как это:Лучший способ конвертировать список списков в список кортежей?

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

где кортеж N состоит из N-го элемента из каждого из трех подсписков? Должен ли я использовать хвостовую рекурсивную функцию, понимание списка или какой-либо другой подход?

+0

Пожалуйста, объясните с помощью решения вышеуказанной проблемы. –

ответ

2

One элегантным решением может быть

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

Я предпочитаю в вашем случае список понимания, потому что:

  • это короткая строка кода, легко читать,
  • не нужно вспомогательную функцию, поэтому операция делается явно видимый.

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

Если это преобразование должно быть сделано во многих местах, то лучше записать его в отдельную функцию, а затем какое-либо решение (даже тело рекурсии с осторожностью), что хорошо для меня.

+0

. Пожалуйста, объясните проблему с решением проблемы. –

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)]. 
+0

Пожалуйста, объясните, почему нисходящее. Это полезно :) –

8

Просто используйте стандартную 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}] 
+0

Похоже, что вы читаете вопрос лучше меня: o) – Pascal

 Смежные вопросы

  • Нет связанных вопросов^_^