Perl - Разбить массив на меньшие равномерно распределенные массивы - PullRequest
3 голосов
/ 28 мая 2011

Как бы я разделил массив Perl произвольного размера на переменное число меньших массивов, чтобы количество элементов в каждом меньшем массиве распределялось как можно более равномерно?Исходный массив не должен быть уничтожен.

Ответы [ 4 ]

8 голосов
/ 28 мая 2011

с макушки головы:

use strict;
use warnings;

use Data::Dumper; # for debugging only 

print Dumper(distribute(7, [1..30]));

# takes number+arrayref, returns ref to array of arrays
sub distribute {
    my ($n, $array) = @_;

    my @parts;
    my $i = 0;
    foreach my $elem (@$array) {
        push @{ $parts[$i++ % $n] }, $elem;
    };
    return \@parts;
};

Это гарантирует, что количество элементов в @parts может отличаться только на один. Есть еще одно решение, которое заранее подсчитывает числа и использует сплайсинг:

push @parts, [ @$array[$offset..$offset+$chunk] ];
$offset += chunk;
# alter $chunk if needed. 
5 голосов
/ 19 апреля 2012

Вот версия, использующая List :: MoreUtils:

use strict;
use warnings;

use List::MoreUtils qw(part);

use Data::Dumper;

my @array = 1..9;
my $partitions = 3;

my $i = 0;

print Dumper part {$partitions * $i++ / @array} @array;
1 голос
/ 01 декабря 2015

@ Ответ Даллайлаена не совсем работает, потому что вы не можете передать массив в подпрограмму в Perl. Вместо того, чтобы передавать массив (или список, как это сделал Даллайлаен в своем примере), вы должны передать ссылку на массив:

    my @arrayIn = (1..30);
    my @arrayOfArrays = distribute(7, \@arrayIn);
    sub distribute {
        my ($n, $array) = @_;

        my @parts;
        my $i = 0;
        foreach my $elem (@$array) {
            push @{ $parts[$i++ % $n] }, $elem;
        };
        return @parts;
    };
1 голос
/ 09 января 2015

Если вам все равно, что будет в каждом массиве:

use strict;
use warnings;

use List::MoreUtils qw(part);
use Data::Dumper;

my $i = 0;
my $numParts = 2;
my @part = part { $i++ % $numParts } 1 .. 30; 
print Dumper @part;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...