Comment mélanger deux tableaux exactement de la même manière en Perl?
Question
Quelqu'un sait comment lecture aléatoire deux tableaux au hasard exactement de la même façon en Perl? Par exemple, dire que j'ai ces deux tableaux:
Avant de brassage: tableau 1: 1, 2, 3, 4, 5 tableau 2: a, b, c, d, e
Après brassage: tableau 1: 2, 4, 5, 3, 1 tableau 2: b, d, e, c, a
Ainsi, chaque élément de chaque tableau est lié à son élément équivalent.
La solution
Essayez (quelque chose comme) ceci:
use List::Util qw(shuffle);
my @list1 = qw(a b c d e);
my @list2 = qw(f g h i j);
my @order = shuffle 0..$#list1;
print @list1[@order];
print @list2[@order];
Autres conseils
Tout d'abord: tableaux parallèles sont un signe potentiel de mauvais code; vous devriez voir si vous pouvez utiliser un tableau d'objets ou hash et vous épargner cette peine.
Néanmoins:
use List::Util qw(shuffle);
sub shuffle_together {
my (@arrays) = @_;
my $length = @{ $arrays[0] };
for my $array (@arrays) {
die "Arrays weren't all the same length" if @$array != $length;
}
my @shuffle_order = shuffle (0 .. $length - 1);
return map {
[ @{$_}[@shuffle_order] ]
} @arrays;
}
my ($numbers, $letters) = shuffle_together [1,2,3,4,5], ['a','b','c','d','e'];
En fait, utilisez shuffle
pour produire une liste d'indices dans un ordre aléatoire, puis couper tous les tableaux avec la même liste d'indices.
Utilisez List :: Util shuffle
pour mélanger une liste d'indices et cartographier la résultats sur les tableaux.
use strict;
use warnings;
use List::Util qw(shuffle);
my @array1 = qw( a b c d e );
my @array2 = 1..5;
my @indexes = shuffle 0..$#array1;
my @shuffle1 = map $array1[$_], @indexes;
my @shuffle2 = map $array2[$_], @indexes;
Mise à jour Utilisez la solution de Chris Jester-Young. tranches noreferrer"> Array sont un meilleur choix que j'aurais pensé .
Voici une autre façon:
use strict;
use warnings;
use List::AllUtils qw(pairwise shuffle);
my @list1 = qw(a b c d e);
my @list2 = qw(f g h i j);
my @shuffled_pairs = shuffle pairwise{[$a, $b]} @list1, @list2;
for my $pair ( @shuffled_pairs ) {
print "$pair->[0]\t$pair->[1]\n";
}
Sortie:
C:\Temp> sfl e j b g d i a f c h
De cette façon, vous pouvez itérer directement sur @shuffled_pairs
sans avoir besoin de garder un tableau supplémentaire pour les indices et éviter les boucles de type C.