Angenommen, Sie haben genau zwei Listen und sie sind genau die gleiche Länge haben, hier ist eine Lösung, die ursprünglich von merlyn (Randal Schwartz), der es pervers Perlish genannt:
sub zip2 {
my $p = @_/2;
return @_[ map { $_, $_ + $p } 0 .. $p - 1 ];
}
Was hier passiert, ist für ein, dass 10-Elemente-Liste, zuerst finden wir den Drehpunkt in der Mitte, in diesem Fall 5, und speichern Sie es in $p
. Dann erstellen wir eine Liste von Indizes bis zu diesem Punkt, in diesem Fall 0 1 2 3 4. Als nächstes verwenden wir map
, um jeden Index mit einem anderen Index zu paaren, der sich in der gleichen Entfernung vom Drehpunkt befindet, wie der erste Index von Anfang an ist. Geben Sie uns (in diesem Fall) 0 5 1 6 2 7 3 8 4 9. Dann nehmen wir ein Stück von @_
mit diesem als die Liste der Indizes. Das heißt, wenn 'a', 'b', 'c', 1, 2, 3
an zip2
übergeben wird, wird diese Liste in 'a', 1, 'b', 2, 'c', 3
neu angeordnet.
Dieses in einem einzigen Ausdruck kann wie so entlang ysth die Linien geschrieben werden:
sub zip2 { @_[map { $_, $_ + @_/2 } 0..(@_/2 - 1)] }
Ob Sie würden wollen entweder Variation hängt verwenden, ob Sie die Erinnerung sehen selbst, wie sie arbeiten, aber für mich, es war ein Gedankenexpander.
Haskells Zip ist nicht das, was Sie suchen: Es gibt eine Liste der entsprechenden Paare, keine Liste der verschachtelten Elemente. –
Sie haben Recht; Haskell-Listen enthalten Elemente eines einzelnen Typs. Ich habe nicht nachgedacht, als ich mich hier auf Haskell bezog. – asjo
Oft, wenn man denkt, dass sie eine Zip wollen, ist es ein Hash aus zwei Listen zu erstellen. In diesem Fall ist es besser, ein Hash-Slice zu verwenden. '@hash {@keys} = @ Werte'. Wenn das hier nicht der Fall ist, tut mir leid für den Lärm. –