En supposant que vous avez exactement deux listes et ils sont exactement la même longueur, voici une solution à l'origine par Merlyn (Randal Schwartz), qui l'a appelé un effet pervers perlienne:
sub zip2 {
my $p = @_/2;
return @_[ map { $_, $_ + $p } 0 .. $p - 1 ];
}
Qu'est-ce qui se passe ici est que pour une Liste de 10 éléments, d'abord, nous trouvons le point de pivot au milieu, dans ce cas 5, et enregistrez-le dans . Ensuite, nous faisons une liste d'indices jusqu'à ce point, dans ce cas 0 1 2 3 4. Ensuite, nous utilisons map
pour coupler chaque index avec un autre index qui est à la même distance du point de pivot que le premier index est au début, nous donner (dans ce cas) 0 5 1 6 2 7 3 8 4 9. Ensuite, nous prenons une tranche de @_
en utilisant cela comme la liste des indices. Cela signifie que si 'a', 'b', 'c', 1, 2, 3
est passé à zip2
, cette liste sera réorganisée en 'a', 1, 'b', 2, 'c', 3
.
Cela peut être écrit en une seule expression le long des lignes de ysth comme ceci:
sub zip2 { @_[map { $_, $_ + @_/2 } 0..(@_/2 - 1)] }
Que vous voudriez utiliser soit la variation dépend de si vous pouvez vous voir se rappeler comment ils fonctionnent, mais pour moi, c'était un expandeur d'esprit.
Le zip de Haskell n'est pas ce que vous cherchez: il renvoie une liste de paires correspondantes, pas une liste d'éléments entrelacés. –
Vous avez raison; Les listes Haskell contiennent des éléments si un seul type. Je ne pensais pas quand je me suis référé à Haskell ici. – asjo
Souvent quand on pense qu'ils veulent un zip, c'est pour créer un hash à partir de deux listes. Dans ce cas, mieux vaut utiliser une tranche de hachage. '@hash {@keys} = @ values'. Si ce n'est pas le cas ici, alors désolé pour le bruit. –