如何在Perl中以完全相同的方式洗牌两个数组?
有人知道如何用Perl中完全相同的方式随机洗牌两个数组吗? 例如,假设我有两个数组: 洗牌前: 数组1:1,2,3,4,5 数组2:a、b、c、d、e 洗牌后: 数组1:2,4,5,3,1 数组2:b,d,e,c,a 因此,每个数组中的每个元素都绑定到其等效元素。使用如何在Perl中以完全相同的方式洗牌两个数组?,perl,arrays,shuffle,Perl,Arrays,Shuffle,有人知道如何用Perl中完全相同的方式随机洗牌两个数组吗? 例如,假设我有两个数组: 洗牌前: 数组1:1,2,3,4,5 数组2:a、b、c、d、e 洗牌后: 数组1:2,4,5,3,1 数组2:b,d,e,c,a 因此,每个数组中的每个元素都绑定到其等效元素。使用shuffle将索引列表无序排列,并将结果映射到数组上 use strict; use warnings; use List::Util qw(shuffle); my @array1 = qw( a b c d e ); my
shuffle
将索引列表无序排列,并将结果映射到数组上
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;
更新 使用Chris Jester Young的解决方案。是我应该想到的一个更好的选择。试试(类似的)以下方法: 第一:并行数组是坏代码的潜在标志;您应该看看是否可以使用一个对象数组或散列来避免麻烦 尽管如此:
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'];
基本上,使用shuffle以随机顺序生成索引列表,然后使用相同的索引列表对所有数组进行切片。还有另一种方法:
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";
}
输出:
C:\Temp> sfl
e j
b g
d i
a f
c h
C:\Temp>sfl
e j
乙二醇
d i
f
碳氢化合物
这样,您就可以直接在
@shuffled_对上进行迭代,而无需为索引保留额外的数组并避免C样式的循环。您不需要使用映射;数组可以由另一个数组编制索引,该数组包含要获取的索引。:-+用于列表切片的使用。我不记得我应该经常使用它们。@daodoad:我非常喜欢散列切片:@foobar{qw(foobar baz qux)}:-)@Brad Gilbert:我知道你认为将qw(a b c d e)
转换成qw'a b c d e'
可以改善高亮显示,这是非常主观的,但请记住
比更难看到(
和大多数Perl代码都使用qw()
或qw/
。我不确定易读性的损失是否值得颜色的改进。我想添加一个:#可选…@list1=@list1[@order];@list2=@list2[@order];@Sinan:同意,而“回滚”链接正盯着我,很诱人。:-)(顺便说一句,我也喜欢你的方法,我喜欢它;但是我太喜欢列表/散列切片了,所以不能不使用这种方法。:-P)+1指出你不应该有并行数组,而应该有其他东西的数组(数组、散列、对象等等)来物理上保持数据在一起。@Tanktalus:“不应该”太强烈了。这是代码味道,但有时候就是这样。
C:\Temp> sfl
e j
b g
d i
a f
c h