Существует ли элегантный почтовый индекс для чередования двух списков в Perl 5?

StackOverflow https://stackoverflow.com/questions/38345

  •  09-06-2019
  •  | 
  •  

Вопрос

Я недавно "нужен" функция zip в Perl 5 (пока я думал о как рассчитать относительное время? ), то есть функция, которая принимает два списка и "zips" их вместе в один список, чередуя элементы.

(псевдо) пример:

@a=(1, 2, 3);
@b=('apple', 'orange', 'grape');
zip @a, @b; # (1, 'apple', 2, 'orange', 3, 'grape');

Haskell имеет почтовый индекс в Prelude и В Perl 6 встроен zip-оператор , но как это сделать элегантно в Perl 5?

Это было полезно?

Решение

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

sub zip2 {
    my $p = @_ / 2; 
    return @_[ map { 

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

sub zip2 { @_[map { 

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

sub zip2 {
    my $p = @_ / 2; 
    return @_[ map { 

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

<*>

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

,

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

<*>

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

+ $p } 0 .. $p - 1 ]; }

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

,

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

sub zip2 {
    my $p = @_ / 2; 
    return @_[ map { 

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

<*>

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

,

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

<*>

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

+ $p } 0 .. $p - 1 ]; }

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

+ @_/2 } 0..(@_/2 - 1)] }

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

,

Предполагая, что у вас есть ровно два списка, и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), которое назвало его извращенным perlish:

<*>

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

+ $p } 0 .. $p - 1 ]; }

Здесь происходит следующее: сначала для списка из 10 элементов мы находим центральную точку, в данном случае 5, и сохраняем ее в $ p . Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от Опорная точка, поскольку первый индекс находится в начале, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_ , используя его в качестве списка индексы. Это означает, что если 'a', 'b', 'c', 1, 2, 3 передается в zip2 , он вернет этот список, преобразованный в «a», 1, «b», 2, «c», 3 .

Это можно записать в одном выражении вдоль строк ysth, например:

<*>

То, хотите ли вы использовать какой-либо вариант, зависит от того, видите ли вы себя, вспоминая, как они работают, но для меня это был расширитель разума.

Другие советы

модуль List :: MoreUtils имеет функцию zip / mesh, которая должна выполнять хитрость:

use List::MoreUtils qw(zip);

my @numbers = (1, 2, 3);
my @fruit = ('apple', 'orange', 'grape');

my @zipped = zip @numbers, @fruit;

Вот источник функции сетки:

sub mesh (\@\@;\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@) {
    my $max = -1;
    $max < $#

модуль List :: MoreUtils имеет функцию zip / mesh, которая должна выполнять хитрость:

use List::MoreUtils qw(zip);

my @numbers = (1, 2, 3);
my @fruit = ('apple', 'orange', 'grape');

my @zipped = zip @numbers, @fruit;

Вот источник функции сетки:

<*> && ($max = $#

модуль List :: MoreUtils имеет функцию zip / mesh, которая должна выполнять хитрость:

use List::MoreUtils qw(zip);

my @numbers = (1, 2, 3);
my @fruit = ('apple', 'orange', 'grape');

my @zipped = zip @numbers, @fruit;

Вот источник функции сетки:

<*>) for @_; map { my $ix =

модуль List :: MoreUtils имеет функцию zip / mesh, которая должна выполнять хитрость:

use List::MoreUtils qw(zip);

my @numbers = (1, 2, 3);
my @fruit = ('apple', 'orange', 'grape');

my @zipped = zip @numbers, @fruit;

Вот источник функции сетки:

<*>; map

модуль List :: MoreUtils имеет функцию zip / mesh, которая должна выполнять хитрость:

use List::MoreUtils qw(zip);

my @numbers = (1, 2, 3);
my @fruit = ('apple', 'orange', 'grape');

my @zipped = zip @numbers, @fruit;

Вот источник функции сетки:

<*>->[$ix], @_; } 0..$max; }

Я считаю следующее решение простым и легким для чтения:

@a = (1, 2, 3);
@b = ('apple', 'orange', 'grape');
@zipped = map {($a[

Я считаю следующее решение простым и легким для чтения:

<*>

Я считаю, что это также быстрее, чем решения, которые сначала создают массив в неправильном порядке, а затем используют срез для изменения порядка, или решения, которые изменяют @a и @b . ], $b[

Я считаю следующее решение простым и легким для чтения:

<*>

Я считаю, что это также быстрее, чем решения, которые сначала создают массив в неправильном порядке, а затем используют срез для изменения порядка, или решения, которые изменяют @a и @b . ])} (0 .. $#a);

Я считаю, что это также быстрее, чем решения, которые сначала создают массив в неправильном порядке, а затем используют срез для изменения порядка, или решения, которые изменяют @a и @b .

Для массивов одинаковой длины:

my @zipped = ( @a, @b )[ map { 

Для массивов одинаковой длины:

<*>,

Для массивов одинаковой длины:

<*> + @a } ( 0 .. $#a ) ];
my @l1 = qw/1 2 3/;
my @l2 = qw/7 8 9/;
my @out; 
push @out, shift @l1, shift @l2 while ( @l1 || @l2 );

Если списки имеют разную длину, это добавит undef в дополнительные слоты, но вы можете легко исправить это, если не хотите этого делать. Что-то вроде (@ l1 [0] & amp; shift @ l1) сделает это.

Надеюсь, это поможет!

Algorithm :: Loops действительно хорош если вы делаете много такого рода вещей.

Мой собственный код:

sub zip { @_[map 

Algorithm :: Loops действительно хорош если вы делаете много такого рода вещей.

Мой собственный код:

<*>&1 ?

Algorithm :: Loops действительно хорош если вы делаете много такого рода вещей.

Мой собственный код:

<*>>>1 : (

Algorithm :: Loops действительно хорош если вы делаете много такого рода вещей.

Мой собственный код:

<*>>>1)+($#_>>1), 1..@_] }

Это совершенно не изящное решение, и при этом это не лучшее решение для любой части воображения. Но это весело!

package zip;

sub TIEARRAY {
    my ($class, @self) = @_;
    bless \@self, $class;
}

sub FETCH {
    my ($self, $index) = @_;
    $self->[$index % @$self][$index / @$self];
}

sub STORE {
    my ($self, $index, $value) = @_;
    $self->[$index % @$self][$index / @$self] = $value;
}

sub FETCHSIZE {
    my ($self) = @_;
    my $size = 0;
    @

Это совершенно не изящное решение, и при этом это не лучшее решение для любой части воображения. Но это весело!

<*>

Как работать с STORESIZE / PUSH / POP / SHIFT / UNSHIFT / SPLICE - это упражнение, оставленное читателю.

> $size and $size = @

Это совершенно не изящное решение, и при этом это не лучшее решение для любой части воображения. Но это весело!

<*>

Как работать с STORESIZE / PUSH / POP / SHIFT / UNSHIFT / SPLICE - это упражнение, оставленное читателю.

for @$self; $size * @$self; } sub CLEAR { my ($self) = @_; @

Это совершенно не изящное решение, и при этом это не лучшее решение для любой части воображения. Но это весело!

<*>

Как работать с STORESIZE / PUSH / POP / SHIFT / UNSHIFT / SPLICE - это упражнение, оставленное читателю.

= () for @$self; } package main; my @a = qw(a b c d e f g); my @b = 1 .. 7; tie my @c, zip => \@a, \@b; print "@c\n"; # ==> a 1 b 2 c 3 d 4 e 5 f 6 g 7

Как работать с STORESIZE / PUSH / POP / SHIFT / UNSHIFT / SPLICE - это упражнение, оставленное читателю.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top