首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

perl中的二维数组排序解决方法

2013-07-26 
perl中的二维数组排序#!/usr/bin/perluse Encode@ax( [60,90,80,75,65],#语文科目成绩[wang, LI,zhang,k

perl中的二维数组排序
#!/usr/bin/perl
use Encode;
@ax=( [60,90,80,75,65],             #语文科目成绩
      [wang, LI,zhang,ki,huang] ,      #学生姓名
      [75,95,65,85,80] ,             #英文成绩
      [75,95,65,100,99],               #数学成绩 ,假定所有的姓名和成绩都不相同
  
);
#sort{}ax;      #我想按照数学成绩排顺序


for $i (0..$#ax){
       for $x (0..$#{$ax[$i]})  {
       print "$ax[$i][$x]\t";

}
print  "\n"      
};
    #我想按照数学成绩排序,请高手指点#   perl?排顺
[解决办法]

@ax=( [60,90,80,75,65],
      [wang, LI,zhang,ki,huang],
      [75,95,65,85,80],
      [75,95,65,100,99],
);

sub sort_by_math {
$sid = @_;
$i = 0;
@bx = map {[$i++, $_]} @{@ax[$sid]};
@cx = sort {$a->[1] <=> $b->[1]} @bx;
@dx = map {$_->[0]} @cx;
for $x (@ax) {
print "$x->[$_]\t" for @dx;
print "\n";
}
};

sort_by_math(3);

[解决办法]
@ax=( [60,90,80,75,65],
      [wang, LI,zhang,ki,huang],
      [75,95,65,85,80],
      [75,95,65,100,99],
);

sub sort_by_math {
$sid = shift;
$i = 0;
@bx = map {[$i++, $_]} @{@ax[$sid]};
@cx = sort {$a->[1] <=> $b->[1]} @bx;


@dx = map {$_->[0]} @cx;
for $x (@ax) {
print "$x->[$_]\t" for @dx;
print "\n";
}
};

sort_by_math(3);


[解决办法]

#!/usr/bin/perl
use Encode;
use List::MoreUtils 'zip';
@ax=( [60,90,80,75,65],             #语文科目成绩
      [wang, LI,zhang,ki,huang] ,      #学生姓名
      [75,95,65,85,80] ,             #英文成绩
      [75,95,65,100,99],               #数学成绩 ,假定所有的姓名和成绩都不相同
  
);

@order = sort {$ax[3]->[$a]<=>$ax[3]->[$b]} 0..$#{$ax[0]}; # 按数学成绩排序的下标

print "@order\n";

for $i (0..$#ax){
       for $x (0..$#{order})  {
           print "$ax[$i][$order[$x]]\t";

}
print  "\n"      
};


另外,怎么用List::MoreUtils的zip实现类似下面python的解法?perl我不懂,被array,array refernces给搞懵了。
 
In [25]: ax=[ [60,90,80,75,65],
    ...:      ['wang', 'LI','zhang','ki','huang'],
    ...:      [75,95,65,85,80],
    ...:      [75,95,65,100,99],
    ...: ];

In [26]: byperson = zip(*ax)

In [27]: byperson.sort(key=lambda x: x[3])

In [28]: result = zip(*byperson)

In [29]: result
Out[29]: 
[(80, 60, 90, 65, 75),
 ('zhang', 'wang', 'LI', 'huang', 'ki'),
 (65, 75, 95, 80, 85),
 (65, 75, 95, 99, 100)]

热点排行