配列とリスト
perlで配列を使って三つの数値の合計を計算するときは、
my @score = (64, 90, 75); my $sum = 0; foreach my $item (@score) { $sum = $sum + $item; } print $sum;
とすると229と出力されるみたい。
これをpythonで処理するにはリストとsum関数を使って、
score = [64, 90, 75] sum(score)
とすれば合計値229を得ることができた。
perlでは
my @score = (64, 90, 75); $score[3] = 100;
とすると配列の大きさが自動的に大きくなって四つ目の要素が代入されるみたい。
pythonで同じ処理をするには、リストのappendメソッドを使って、
score = [64, 90, 75] score.append(100)
とすればできた。
perlの関数joinを使えば配列の要素を連結して1つの文字列にできるようで、
例えば、
my @score = (64,90,75); print join(',' ,@score), "\n";
とすると配列@scoreの要素をコンマで区切った1つの文字列 64,90,75 が出力される。
pythonのjoinメソッドは文字列のメソッドのため、リストの要素が数の場合は一度文字列
に直さなければならない。したがってpythonで同じ処理を行うには、
score = [64, 90, 75] strscore = [] for i in score: s = str(i) strscore.append(s) print ",".join(strscore)
としなければならない。
joinとは逆に文字列を区切って要素に分割するときはperlでは関数splitを使えばよいみたい。
文字列をコンマで区切って配列@scoreに代入するには、
my @score = split(/,/, '64, 90, 75'); print "@score\n";
とするみたい。
pythonでは文字列のメソッドとしてsplitメソッドがあり、
文字列を引数に与えた文字列で区切った部分を要素として持つリストを返してくるので、
score = "64,90,75".split(",") print score
とすれば['64', '90', '75']と出力される。
perlの例では/,/という正規表現を使っている。pythonで正規表現を使うなら
Regexobjectのsplit()メソッドを使えばよいみたい。
正規表現がマッチしたすべての部分で文字列を区切って各部分をリストで返してくるので、
import re p = re.compile(",") score = p.split("64,90,75") print score
とすれば同じ結果が得られる。
perlのpush関数を使うと配列の最後に要素を追加できるようで、
my @array = ('one', 'two', 'three'); push(@array, 'four'); print "@array\n";
とするみたい。
pythonではappendメソッドを使って、
array = ['one', 'two', 'three'] array.append('four') print array
とすれば['one', 'two', 'three', 'four']と出力される。
perlのpush関数は複数の要素を追加できるみたいだが、
pythonのappendメソッドは1つしか追加できない。
そこで、例えば三つの要素を追加するには、
array = ['one', 'two', 'three'] array2 = ['four', 'five', 'six'] array = array + array2 print array
とすれば
['one', 'two', 'three', 'four', 'five', 'six']
となる。
perlの関数popは関数pushの逆で配列の最後から要素を取り出すようなので、
my @array = ('one', 'two', 'three', 'four'); my $item = pop(@array); print "\@array = @array\n"; print "\$item = $item\n";
とすると
@array = one two three $item = four
となるみたい。
pythonでもpopメソッドで同じことができて、
array = ['one', 'two', 'three', 'four'] item = array.pop() print item, array
とすれば
four ['one', 'two', 'three']
となる。
perlのshift関数は配列の最初の要素を取り出し、unshift関数は配列の先頭へ要素を追加するようで、
my $item = shift(@array); unshift(@array, $item)
のように使うみたい。
これらをpythonで行うならそれぞれ、
item = array.pop(0) array.insert(0, item)
となる。
perlの関数spliceは配列の途中から要素を取り出したり要素を挿入したりできるため、
my @array = ('a', 'b', 'c', 'd', 'e', 'f'); my @xyz = ('X', 'Y', 'Z'); my @removed = splice(@array, 1, 4, @xyz); print "\@array = @array\n"; print "\@removed = @removed\n";
のようにすると、配列@arrayの1〜4番目の要素を削除して、その部分に配列@xyzを
挿入することになって、
@array = a X Y Z f @removed = b c d e
となるみたい。
この処理をpythonでは、
array = ['a', 'b', 'c', 'd', 'e', 'f'] xyz = ['X', 'Y', 'Z'] removed = array[1:5] del array[1:5] array = array + xyz item = array.pop(1) array.append(item) print array, removed
とすれば
['a','X','Y','Z','f'] ['b','c','d','e']
となるけど、なんだかめんどうな気も。
pythonでのリストの並べ替えにはsortメソッドとreverseメソッドが使えて、
array = ['b', 'a', 'e', 'c', 'f', 'd'] array.sort() print array
とすれば文字コードが小さい順にソートされ、
['a', 'b', 'c', 'd', 'e', 'f']
となる。
リストの要素が数値のときは小さい順にソートされる。
reverseメソッドを使えば、
array = ['a', 'b', 'c', 'd', 'e', 'f'] array.reverse() print array ['f', 'e', 'd', 'c', 'b', 'a']
のように逆順になる。