2015-05-30 10 views
5

Qual è il modo migliore per convertire un elenco, come [[1,2,3],[a,b,c],[4,5,6]] ad una lista di tuple come questo:Il modo migliore per convertire la lista delle liste nella lista delle tuple?

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

dove tupla N è composto dell'elemento Ennesimo da ciascuno dei tre sottoliste? Dovrei usare una funzione ricorsiva di coda, una comprensione di lista o qualche altro approccio?

+0

Spiegare con la soluzione al problema precedente –

risposta

2

One la soluzione elegante può essere

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

preferisco nella lista caso di comprensione perché:

  • si tratta di una breve riga di codice, facile da leggere,
  • non ha bisogno di una funzione di supporto, in modo da l'operazione fatta è chiaramente visibile.

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

Se questa trasformazione deve essere fatto in molti luoghi, è meglio scriverlo in una funzione separata, e quindi ogni soluzione (anche la ricorsione corpo con cautela) è bene per me.

+0

Si prega di fornire la spiegazione con la soluzione del problema precedente. –

0

Per esempio così:

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

Si prega di spiegare perché un downvote. È utile :) –

8

Basta utilizzare la funzione standard 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}] 

O se si preferisce evitare di estrarre le singole liste:

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

Sembra che tu abbia letto la domanda meglio di me: o) – Pascal