【Pythonを勉強したい】②(チマチマ勉強中 Part1)の続き。だんだん楽しくなってきました。

  • Pythonの基本
⑦リスト・タプル・辞書

リスト(list)はこんな感じ。
a = [ 1, 2, 3, 4 ];

b = [
    'One',
    'Two',
    'Three',  最後のカンマは省略可能
];

c = {
    1,
    'one', 最後のカンマは省略可能
};

d = [ 1, 2, 3, 4 ];
for idx in d:
    print( idx );

e = [ 1, 2, 3, 4 ];
print( e[0] ); => 1 インデックス0
print( e[2] ); => 3 インデックス2

f = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
print( f[2:5] ); => 3,4,5 インデックス2からインデックス5の前(インデックス4)まで

g = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
print( f[1:8:2] ); => 2,4,6,8 インデックス1からインデックス7(8-1)まで2個飛ばし

h = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
print( f[-1] ); => 9 マイナスをつけると後ろから数える。後ろから1番目。
print( f[-5:-3] ); => 5,6 後ろから5番目から3番目の前(4番目)まで。

i = [ 1, 2, 3, 4, 5 ] + [ 6, 7, 8, 9]; +でリストを結合できる。
print( i ); => 1, 2, 3, 4, 5, 6, 7, 8, 9

j = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
print( len( j ) ); => 9 len(リスト)でリストの要素数を計算できる。

k = [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ]; リストのリストを作ることが出来る。
for idx1 in k:
    for idx2 in idx1:
        print( idx2 ); => 1,2,3,4,5,6
タプル(tuple)はこんな感じ。
a = ( 1, 2, 3 );

b1 = ( 10 ); 数値の10
b2 = ( 10 ); タプルの10。要素が1つの場合は最後にカンマが要る。

c1 = [ 1, 2, 3, 4 ];
c2 = ( 1, 2, 3, 4 );
c1[ 1 ] = 5;  OK:リストは要素の変更ができる。
c2[ 1 ] = 5;  NG:タプルは要素の変更ができない。
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    c2[ 1 ] = 5;
TypeError: 'tuple' object does not support item assignment

d1 = [ 1, 2, 3, 4 ];
d2 = ( 1, 2, 3, 4 );
print( tuple( d1 ) ); => (1, 2, 3, 4 ) リストからタプルへの変換
print( list( d2 ) ); => [ 1, 2, 3, 4 ] タプルからリストへの変換
辞書(dict)はこんな感じ。
a = { "pavement1234": 1234, "spaceshiptrain999": 999 , "m78seiun":78 };
print( a ); => {'pavement1234': 1234, 'spaceshiptrain999': 999, 'm78seiun': 78}
print( a[ "pavement1234" ] ); => 1234
print( a[ "spaceshiptrain999" ] ); => 999
print( a[ "m78seiun" ] ); => 78

b = { "pavement1234": 1234, "spaceshiptrain999": 999 , "m78seiun":78 };
for key, value in b.items():
    print( key, value ); =>
pavement1234 1234
spaceshiptrain999 999
m78seiun 78


for key in b.keys():
    print( key, b[ key ] ); =>
pavement1234 1234
spaceshiptrain999 999
m78seiun 78


for value in b.values():
    print( value ); =>
1234
999
78

for key, value in b.iteritems():
    print( key, value ); =>
Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    for key, value in b.iteritems():
AttributeError: 'dict' object has no attribute 'iteritems'
Python3はiteritems()が無くなった。
リスト関数(map()、filter()、reduce())はこんな感じ。

map()はリストの各要素に指定処理を実行し結果を返す。
def multiple_of_2( x ): return x * 2;
a = [ 1, 2, 3 ];
print( map( multiple_of_2, a ) ); => <map object at 0x03957C70>
Python2はmap()を呼ぶとリストを返したが、Python3はiterator objectを返すようになったらしい。
print( list( map( multiple_of_2, a ) ) ); => [2, 4, 6] list()で変換すれば良い。
print( list( map( lambda x: x * 2, a ) ) ); => [2, 4, 6]
print( [ x * 2 for x in a ] ); => [2, 4, 6] 内包表記と言うらしい。また後で出てくる。
ちなみにlabmdaは無名関数。以下のように書きます。
lambda 引数: 戻り値 
filter()はリストの各要素に指定処理を実行しTrueのものだけを返す。
def is_xjapan( x ): return x == 'x-japan';
a = [ 'x-japan', 'y-japan', 'z-japan' ];
print( filter( is_xjapan, a ) ); => <filter object at 0x03957BD0>
Python2はfilter()を呼ぶとリストを返したが、Python3はiterator objectを返すようになったらしい。
print( list( filter( is_xjapan, a ) ) ); => ['x-japan'] ist()で変換すれば良い。
print( list( filter( lambda x: x == 'x-japan', a ) ) ); =>  ['x-japan']
print( [ x for x in a if x == 'x-japan' ] ); => ['x-japan'] 内包表記。
reduce() はリストの最初の2要素を引数に処理を実施。処理結果と次の要素を引数に処理を実施。を繰り返し、最終的に1つの結果を返します。以下の処理はすべての要素の掛け算が計算されます。
from functools import reduce Python3からredice()はグローバル関数ではなくなったのでfunctoolsからインポートする必要があります。
def mul( x, y ): return x * y;
a = [ 1, 2, 3, 4, 5 ];
print( reduce( mul, a ) ); => 120 (1*2*3*4*5)
print( reduce( lambda x,y: x*y, a ) ); => 120 (1*2*3*4*5)
リストの内包表記はこんな感じ。
[counter for counter in iterator] 基本構文はこんな感じ
pythonの内包表記を少し詳しく読むと一般的に内包表記にすると速度が2倍になるとか。理由はループの度にリストオブジェクトのappendを参照、appendはPythonの関数として実行される。とのこと。
a = [ 2, 4, 6 ];
print( [ xxx * 3 for xxx in a] ); => [6, 12, 18]
print( [ xxx * 3 for xxx in a if xxx == 6] ); => 18
print( [ [ xxx, xxx * 3 ] for xxx in a ] ); => [[2, 6], [4, 12], [6, 18]]
print( [ ( xxx, xxx * 3 ) for xxx in a ] ); => [(2, 6), (4, 12), (6, 18)]

b = [ 9, 8, 7 ];
print( [ xxx * yyy for xxx in a for yyy in b ] ); => [18, 16, 14, 36, 32, 28, 54, 48, 42]
print( [ a[ idx ] * b[ idx ] for idx in range( len( a ) ) ] ); => [18, 32, 42]

セット(set)はこんな感じ。
重複のないリストを作ります。セット同士のOR、AND、XOR、引き算ができます。足し算はできません。
a = set( [ 'one', 'two', 'three' ] );
b = set( [ 'three', 'four', 'five', 'six' ] );
aとbは'three'が重複しています。
print( a ); => {'one', 'two', 'three'}
print( b ); => {'three', 'five', 'six', 'four'} なんか順番変だけどいいか。
print( a + b ); =>
Traceback (most recent call last):
  File "<pyshell#124>", line 1, in <module>
    print( a  + b );
TypeError: unsupported operand type(s) for +: 'set' and 'set' set同志の足し算はできない

print( a - b ); => {'one', 'two'} aからbの要素`three’が除かれた
print( a | b );  => {'six', 'five', 'two', 'one', 'three', 'four'} aとbの要素すべて
print( a & b ); => {'three'} `three’のみ
print( a ^ b ); => {'five', 'two', 'six', 'one', 'four'} `three’以外すべて

print( 'five' in a ); => False aに`five’はないのでFalse

b.add( 'ten' ); bに’ten’を追加
print( b ); => {'ten', 'five', 'three', 'six', 'four'} ’ten’が増えた
⑧演算子

代数演算子(+、-、*、/、%、**、//)はこんな感じ。

+a 正数
-a 負数
a + b 加算
a - b  減算
a * b 乗算
a / b 除算
a % b aをbで割った余り
a ** b aのb乗
a // b 切り捨て除算
ビット演算子(~、&、|、^、<<、>>)はこんな感じ。
~a ビット反転
a & b AND:論理積
a | b OR:論理和
a ^ b XOR:排他的論理和
a << b bビット左シフト
a >> b bビット右シフト
代入演算子(=、+=、-=、*=、/=、%=、**=、//=、&=、|=、^=、<<=、>>=)はこんな感じ。
a = b aにbを代入
a += b a = a + b
a -= b a = a - b
a *= b a = a * b
a /= b a = a / b
a %= b a = a % b
a **= b a = a ** b
a //= b a = a // b
a &= b a = a & b
a |= b a = a | b
a ^= b a = a ^ b
a <<= b a = a << b
a >>= b a = a >> b
比較演算子(==、!=、<、>、<=、>=、<=>、===)はこんな感じ。
a == b aとbは等しい
a != b aとbは異なる
a < b aはbより小さい
a > b aはbより大きい
a <= b aはb以下
a >= b aはb以上
a <> b aとbは異なる
a is b aとbは等しい
a is not b aとbは異なる
a in b aはbに含まれる
a not in b aはbに含まれない
ブール演算子(and、or、not)はこんな感じ。
a and b aとbが真であれば真
a or b aかbが真であれば真
not a aが偽であれば真
条件演算(if - else)はこんな感じ。
x if c else y cが真であればxを返す。cが偽であればyを返す。
文字列演算(+、*、[n:m])はこんな感じ。
a + b 文字列aと文字列bを連結
a * n 文字列aをn回繰り返す。
a[n] 文字列aのn番目の文字を取り出す。
a[n:m] 文字列aのn番目からm番目の文字列を取り出す。
a[n:] 文字列aのn番目から最後までの文字列を取り出す。
a[:m] 文字列aの0番目からm番目の文字列を取り出す。
a[n:m:s] 文字列aのn 番目から m 番目の文字列をs個とばしで取り出す。






IMG-20190405-WA0007



スポンサードリンク