2011-03-07 3 views
2

Je veux convertir [z,z,a,z,z,a,a,z] en [{z,2},{a,1},{z,2},{a,2},{z,1}]. Comment puis-je le faire? Donc, j'ai besoin d'accumuler la valeur précédente, le compteur et la liste des tuples.Liste à la liste des tuples conversion

J'ai créer dossier

-record(acc, {previous, counter, tuples}). 

redéfinie

listToTuples([]) -> []; 
listToTuples([H | Tail]) -> 
    Acc = #acc{previous=H, counter=1}, 
    listToTuples([Tail], Acc). 

Mais j'ai quelques problèmes

listToTuples([H | Tail], Acc) -> 
    case H == Acc#acc.previous of 
     true -> 
     false -> 
    end. 

Répondre

8

si vous construisez votre réponse (Acc) dans le sens inverse, la le précédent sera la tête de cette liste.

est ici comment je le ferais -

list_pairs(List) -> list_pairs(List, []). 

list_pairs([], Acc) -> lists:reverse(Acc); 
list_pairs([H|T], [{H, Count}|Acc]) -> list_pairs(T, [{H, Count+1}|Acc]); 
list_pairs([H|T], Acc) -> list_pairs(T, [{H, 1}|Acc]). 

(i attendre que quelqu'un va maintenant suivre avec une ligne version compréhension de la liste ..)

+0

Je doute que vous pouvez le faire avec une compréhension de la liste. Vous avez besoin d'un pli au moins. –

5

je continuerais sur la construction de routes la liste à l'envers. Notez le motif correspondant à X sur la première ligne.

F = fun(X,[{X,N}|Rest]) -> [{X,N+1}|Rest]; 
     (X,Rest)   -> [{X,1}|Rest] end. 

lists:foldr(F,[],List). 
+1

Utilisez 'lists: foldr/3' et vous êtes à la maison. ;) –

+0

Merci, maintenant édité avec foldr –

+0

Avec 'lists: foldr/3' vous ne construisez pas vraiment dans les listes en sens inverse, du moins pas de la même façon que vous appelez utiliser un accumulateur et appeler' lists : inverse/1' dessus. 'lists: foldr' fonctionne simplement sur la liste de droite à gauche pour traiter tous les éléments dans l'ordre inverse, ce qui est ** défini ** à faire. Ce n'est pas la queue récursive, ce qui n'est pas toujours une si mauvaise chose. Ceci est mentionné dans les documents. – rvirding

2

Personnellement, j'utiliser lists:foldr/3 ou le faire à la main avec quelque chose comme:

list_to_tuples([H|T]) -> list_to_tuples(T, H, 1); 
list_to_tuples([]) -> []. 

list_to_tuples([H|T], H, C) -> list_to_tuples(T, H, C+1); 
list_to_tuples([H|T], P, C) -> [{P,C}|list_to_tuples(T, H, 1); 
list_to_tuples([], P, C) -> [{P,C}]. 

L'utilisation de deux accumulateurs vous permet d'économiser la construction inutilement et de séparer un tuple pour chaque élément dans la liste. Je trouve l'écriture de cette façon plus claire.

Questions connexes