Perl で言う、map
、grep
、sort
を Python で表すと次のようになる。
Are Python list comprehensions the same thing as map/grep in Perl? – Stack Overflow
http://stackoverflow.com/questions/1418912/are-python-list-comprehensions-the-same-thing-as-map-grep-in-perl
map
Perl
my @ary1 = 0 .. 4; my @ary2 = map $_ ** 2, @ary1; # @ary2 = ( 0, 1, 4, 9, 16 ) となる
Python
ary1 = range( 5 ) ary2 = map( lambda x: x ** 2, ary1 ) # あるいは ary2 = [ x ** 2 for x in ary1 ]
grep
Perl
my @ary1 = 0 .. 9; my @ary2 = grep $_ % 2, @ary1; # @ary2 = ( 1, 3, 5, 7, 9 ) となる
Python
ary1 = range( 10 ) ary2 = filter( lambda x: x % 2, ary1 ) # あるいは ary2 = [ x for x in ary1 if x % 2 ]
sort
Perl
my @ary1 = qw! lAmbDA3 LAMBDA2 lamBDA4 LAMbda1 !; my @ary2 = sort { lc $a cmp lc $b } @ary1; # @ary2 = qw! LAMbda1 LAMBDA2 lAmbDA3 lamBDA4 ! となる
Python
ary1 = "lAmbDA3 LAMBDA2 lamBDA4 LAMbda1".split() ary2 = sorted( ary1, key = lambda x: x.lower() )
基本的には、Perl におけるブロックをラムダ式に直せばよい。でも、こう書いといて何だが、ラムダ式使うと可読性ががくんと落ちるね。実際のコーディングでは多少冗長でも関数定義を使った方がいい希ガス。