Hatena::ブログ(Diary)

tachikawa844の日記

2008-12-04

配列とリスト

| 18:06

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']

のように逆順になる。

トラックバック - http://d.hatena.ne.jp/tachikawa844/20081204/1228381610
Connection: close