Transposer la liste des listes sans boucle forJ'aimerais avoir une méthode pour transposer une liste de listes sans utiliser de boucle for. C'est-à-dire une fonction (appelez-la "Listtranspose" par exemple) qui inverse les "lignes" et les "colonnes" d'une liste de listes, comme ceci :
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
tranlist = Listtranspose(listlist);
Show(tranlist);
/*Result:
{{"cat", "meow"}, {"dog", "bark"}, {"mouse", "squeak}}
Une autre implémentation pourrait ressembler à ceci :
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
nr = NItems(listlist);
col1 = listlist[1::nr][1];
col2 = listlist[1::nr][2];
col3 = listlist[1::nr][3];
translist = EvalList({col1, col2, col3});
J'aime mieux cette dernière implémentation, car je n'aurai peut-être besoin de transposer qu'un sous-ensemble de "colonnes", pas la liste entière.
Bien sûr, cela peut être fait en utilisant une boucle For, mais la raison pour laquelle nous demandons cela est que les boucles For peuvent être lentes. Je travaille avec de gros blocs de texte et je pense que cela m'aiderait à accélérer considérablement les choses.
Crédit à @vince_faller pour avoir demandé cela à l'origine.Transposer la liste des listes sans boucle for
Automatisation et scriptsRe : Transposer une liste de listes sans boucle forJ'y pense encore un peu.Je n'arrive toujours pas à battre la boucle for, mais j'ai pensé que j'écrirais ceci au cas où cela aiderait quelqu'un.
// make a blank data table with the right shape
dt = As Table(J(nr, nc, .), <<PRIVATE></PRIVATE>
Re : Transposer une liste de listes sans boucle for@Craige_Hales Merci pour la formidable perspicacité Craig. Je suis d'accord, j'ai fait un test de vitesse de la méthode boucle for vs attribution parallèle, et l'attribution parallèle était beaucoup plus lente. Mon tableau de liste était de 718r x 14182c, donc> 10 millions d'éléments. J'ai exécuté le script pendant environ 10 minutes et l'opération ne s'est pas terminée. Cela semble être un peu plus lent que ce que prédisent vos données ci-dessus, mais il y a trop de variables à prendre en compte (par exemple, le système informatique, le rapport colonnes/lignes ?). La boucle For est beaucoup plus rapide à ~ 10,1 s pour la même table.
Mais c'est quand même plus lent que je ne le souhaiterais. Ce serait formidable d'avoir une fonction JMP capable de faire cela en interne.
Re : Transposer une liste de listes sans boucle forMais, après quelques tests, je pense qu'une simple boucle imbriquée sera plus rapide que toute autre approche basée sur JSL.
result = {};
for( c = 1, c <= nc, c += 1,
thisrow = {}; // build a row from a column
for( r = 1, r <= nr, r += 1,
thisrow[r] = testList[r][c];
);
result[c] = thisrow;
);@DonMcCormack - Défi!
The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.La boucle for de la ligne bleue est toujours meilleure. La table JSON violette pourrait la dépasser, mais je manque de mémoire. L'astuce d'attribution parallèle commence à échouer pour les grands nombres.
L'affectation parallèle bloque probablement les threads les uns contre les autres, tout le temps. Il bat la table de données json au début en raison des différents frais généraux entre les deux.
Re : Transposer une liste de listes sans boucle forOui, ce serait bien d'avoir plus de fonctions de manipulation de liste. Je n'arrive pas à trouver un moyen agréable ou rapide, mais après avoir joué un peu, j'ai trouvé ceci. Il a besoin de JMP 15, échoue en 14.
list = {{"lion", "tiger", "puma"}, {"lamp", "torch", "pharos"}, {"lark", "toucan", "pigeon"}, {"lawn", "terrace", "patio"}};
jlist = As JSON Expr( list );
dt1 = JSON To Data Table( jlist, invisible(1) );
dt1 << New Column( "row", numeric, setvalues( 1 + Floor( (0 :: (N Rows( dt1 ) - 1)) / N Items( list[1] ) ) ) );
dt2 = dt1 << Split( Split By( :row ), Split( column(dt1,1) ), Sort by Column Property, invisible(1) );
Close( dt1, nosave );
transposed = dt2[0, 0];
Close( dt2, nosave );
Show( list, transposed );list = {{"lion", "tigre", "puma"}, {"lampe", "torche", "pharos"}, {"alouette", "toucan", "pigeon"}, {"pelouse", "terrasse", "patio"}} ;
transposé = {{"lion", "lampe", "alouette", "pelouse"}, {"tigre", "torche", "toucan", "terrasse"}, {"puma", " phare ", "pigeon", "patio"}};
Affichez les tableaux intermédiaires pour voir ce qu'il fait. Une vraie solution devrait traiter les rangées de longueur inégale.
Re : Transposer une liste de listes sans boucle for@Craige_Hales a écrit une excellente explication que j'utilise régulièrement.Dépannage multithreading à l'aide de Parallel Assign
Re : Transposer une liste de listes sans boucle for@vince_faller
Esprit == Soufflé.
Je n’ai jamais entendu parler de la fonction Parallel Assign auparavant. J'ai essayé ça, et oui, ça marche. Même si je travaille avec des chaînes de caractères et qu'il s'agit techniquement d'une fonction matricielle, cela s'en fiche. Il sera intéressant de jouer avec cela et de voir si c'est plus rapide qu'une boucle for. J'essaierai de mettre à jour ici une fois que je le saurai.
Merci pour l'idée!
Re : Transposer une liste de listes sans boucle forJe jure de haut en bas que j'ai vu quelqu'un faire quelque chose du genre
{"cat", "dog", "mouse", "meow", "bark", "squeak"}[[1 1, 1 1]]
// and had it return
{{"cat", "cat"}, {"cat", "cat"}}
lors d'un exposé à la découverte mais je n'ai jamais réussi à le recréer.Tout cela aurait pu être un rêve ?
Si je me souviens bien, ils ont en quelque sorte façonné une nouvelle liste à partir d'une liste plate sur une seule ligne comme celle-là.Je ne m'en souviens probablement pas bien.
Cela étant dit, vous pouvez probablement effectuer des affectations parallèles très rapidement.
names default to here(1);
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
m = J(nc, nr, -1);
::trans_list = Aslist(m);
Parallel Assign({l = listlist},
m[a, b] = (
::trans_list[a][b] = l[b][a];
)
);
show(::trans_list);Re : Transposer une liste de listes sans boucle for2024 - JMP18
quelle est la meilleure/la plus rapide façon de transposer une liste de listes ?
Re: Transposer une liste de listes sans boucle for@hogi, tu pourrais exécuter les scripts ci-dessus et nous tenir au courant ? :cara_que_sonríe_con_ojos_sonrientes: (paresseux/égoïste)
Re: Transposer une liste de listes sans boucle forExcusez-moi, je voulais dire que j'étais paresseuse et égoïste. J'avais un emoji d'ange, mais il n'est pas apparu. Toutes mes excuses.
Re: Transposer une liste de listes sans boucle forExécutez les scripts : cette approche ne fonctionne que si l’approche la plus simple/rapide/optimale de 2024 figure déjà dans la liste des possibilités de 2021 ; )
Peut-être existe-t-il maintenant une fonction listtranspose(liste de listes) ultra-rapide et super-simple, rendue possible par les améliorations apportées à JMP17 ou JMP18 ?
Re: Transposer une liste de listes sans boucle forAvec un seul vote depuis 2021, je pense qu'il y a peu de chances pour
Listtranspose(listlist);
Si vous avez trouvé cette suggestion, merci de prendre le temps de consulter également Insérer dans : Flatten(0|1) et de voter 
Re: Transposer une liste de listes sans boucle forL'affectation parallèle (sous forme de boucle for bidimensionnelle) n'a aucune chance face à la boucle for unidimensionnelle.
(... ou l'approche de @vince_faller via la manipulation de tableaux de données)
Le gagnant sur mon système : DataTable !

Re: Transposer une liste de listes sans boucle for
L'inconvénient de ne pas avoir d'émojis dans la communauté ; )