Python入門4

****************************************
コレクション型
****************************************

リスト、タプル、集合、辞書などがあります。


****************************************
リスト
****************************************

配列のようなデータ構造をPythonで実現するには「リスト」を使います。
ただし、キーワードは除きます。

リストはサイズ可変であったり、要素に異なるデータ型を混在することも出来ます。
角括弧を使用。


>>>number = [1, 2, 3, 4, 5]
>>>i = 0
>>>while i < len(number):
...    print(number[i])
...    i = i + 1
...
1
2
3
4
5

 

リストに要素を追加したり削除したりする。

追加
>>>number = [1, 2, 3, 4, 5]
>>>number.append(10)
>>>number
[1, 2, 3, 4, 5, 10]

 

挿入(0から数えて3の位置に挿入)
>>>number = [1, 2, 3, 4, 5]
>>>number.insert(3, 10)
>>>number
[1, 2, 3, 10, 4, 5]

 

削除(左から調べて初めて見つかった2を削除)
>>>number = [1, 2, 3, 4, 5, 3, 2]
>>>number remove(2)
>>>number
[1, 3, 4, 5, 3, 2]

 

numberはリストのオブジェクトの参照値です。


リスト自体をコピーするには

モジュールのインポートに関しては後で説明しますが、ここでは、リストのコピーについて説明します。

リストのコピーは、代入するだけではそれぞれのリストの参照先が同じであるため、片方の値を変更しても両方とも同じ値になってしまう。
>>>number = [1, 2, 3]
>>>number2 = number
>>>number2[1] = 99
>>>number[1]
99
>>>number2[1]
99


別のオブジェクトとして扱う。
copy関数を使います。
>>>number = [1, 2, 3]
>>>number2 = number.copy
>>>number2[1] = 99
>>>number[1]
2
>>>number2[1]
99

または、次の方法でもコピーが出来ます。
>>>number = [1, 2, 3]
>>>number2 = number[:]
>>>number2[1] = 99
>>>number[1]
2
>>>number2[1]
99


ただし、リストの中のリストの場合は、同じ参照先になってしまう。
>>>listDat = ['abc', 'def',[10, 20, 30]]
>>>listDat2 = listDat.copy()

 

>>>listDat2[0] = 'xxx'
>>>listDat2[2][0] = 99
>>>listDat
 ['abc', 'def',[99, 20, 30]]
>>>listDat2
['xxx', 'def', [99, 20, 30]]

copyでは、リストの中のリストは参照先が同じなのでコピー元も変更されている。

この場合、copyモジュールをインポートしてdeepcopyを使いましょう。

>>>import copy
>>>listDat = ['abc', 'def',[10, 20, 30]]
>>>number2 = copy.deepcopy(listDat)


>>>listDat2[0] = 'xxx'
>>>listDat2[2][0] = 99

>>>listDat
['abc', 'def',[10, 20, 30]]
>>>listDat2
['xxx', 'def', [99, 20, 30]]

 

 


数を調べる
>>>number=[1, 5, 10, 3, 10]
>>>number.count(10)
2

10が二つある

 

>>>number=[1, 5, 10, 3, 10]
>>>for number in number
...    print(number)
...
1
5
10
3
10

 

>>>number=[1, 2, 3, 4, 5]
>>>number[0:2]
[1, 2]

>>>number[1:3]
[2, 3]

 

>>>if 3 in number:
...    print('3があった')
...
3があった

 

右端と、右側から2つめまで指定
>>>number=[1, 2, 3, 4, 5]
>>>number[-1: -3]
[]
>>>number[-3: -1]
[3, 4]

 

右端と、右側から2つめまで指定、ステップは逆向き
>>>number=[1, 2, 3, 4, 5]
>>>number[-1: -4: -1]
[5, 4, 3]

 

 

 

並び替え
>>>number=[3, 2, 4, 5, 1]
>>>number.sort()
>>>number
[1, 2, 3, 4, 5]


降順ソート
>>>number.reverse()
>>>number
[5, 4, 3, 2, 1]


もう一つの降順ソート
>>>number.sort(reverse = True)
>>>number
[5, 4, 3, 2, 1]

 

 

>>>number = [[3, 7], [8, 5], [1, 6]]
>>>number.sort(key = lambda x: x[0])
>>>number
[[1, 6], [3, 7], [8, 5]]


>>>number=[1, 2, 3, 4, 5]
>>>if 4 in number:
...    print('numberは、4が含まれます。')
...
numberは、4が含まれます。

 

>>>if 4 not in number:
...    print('numberは、4を含みません')
...else
...    print('numberは、4を含まれます。')
...
numberは、4が含まれます。

 


スタックポインタの様な使い方

>>>stack = [1, 2]
>>>stack.append(9)
>>>stack
[1, 2, 9]


>>>stack.pop()
9
>>>stack
[1, 2]
>>>stack.pop()
2
>>>stack
[1]

 

 

range関数

10の手前までの数字を設定
>>>list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


2の位置から10の手前までの数字を設定
>>>list(range(2,10))
[2, 3, 4, 5, 6, 7, 8, 9]


2の位置から10の手前までの数字を2ステップづつ設定
>>>list(range(1, 10, 2)
[1, 3, 5, 7, 9]


>>>number=list(range(10))
>>>number
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


for文での使用例
>>>for x in range(10)
    print(x)
...
...
0
1
2
3
4
5
6
7
8
9

 

 

 


>>>number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>del number[1]
>>>number
 [0, 2, 3, 4, 5, 6, 7, 8, 9]

 

>>>number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>del number[1:5]
>>>number
 [0, 6, 7, 8, 9]

 

全ての要素を削除
>>>number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>del number[:]
>>>number
[]

 

 


■リスト内包表記

 


>>>[x for x in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


>>>number = [x for x in range(10) if x % == 0]
>>>number
[0, 2, 4, 6, 8]

 

変数y に越された要素を順番に変数xにコピー
>>>number = [[1, 2],[3, 4],[5, 6]]
>>>number = [x for y in number for x in y]
>>>number
[1, 2, 3, 4, 5, 6]

 

 

****************************************
タプル
****************************************

リストと同じデータ構造ですが、要素の値を変更することはできません。
リストよりも処理が高速だとされています。


>>>number = (1, 2, 3, 4, 5)
>>>number
(1, 2, 3, 4, 5)

 

変更や追加・削除が出来ないので、これだとエラーが出ます。
>>>number[1]=10


ただ、全部削除することは出来ます。
del文でリストやタプルを削除出来る。
>>>del number

 

また、変数全体を書き換える事もできます。
>>>number
(1, 2, 3, 4, 5)
>>>number = ['abc', 'def', 'ghi']
>>>number
['abc', 'def', 'ghi']

 

tuple関数
>>>ss = tuple('abc')
>>>ss
('a', 'b', 'c')

 

>>>ss = tuple('abc', 'def', 'ghi')
>>>ss
('abc', 'def', 'ghi')

 

 


複数のオブジェクトを一つにまとめるので「パック」
>>>number = 1, 2, 3, 4, 5
>>>number
(1, 2, 3, 4, 5)

 

アンパック
>>>item1, item2, item3, item4, item5 = number
>>>item2
2

>>>ss = 'Python'
>>>a, b, c, d, e, f = ss
>>>ss[1]
b

 

 

 

要素が一つしか無い場合、カンマを入れる。

>>>number = (1,)
(1,)

 

要素の無いタプル

>>>number = ()
()

 


-----------------------------------------------
仮引数に「*」が付くと、可変長引数になる。
タプルなどを引数にして呼び出すことが出来る。


>>>def func(*x):
...    for n in x:
...     print(n)
...
>>>func(10, 20)
10
20


>>>def func(*x):
...    for n in x:
...        print(n)
...
>>>func("abc", "def", "ghi")
abc
def
ghi


****************************************
集合
****************************************
集合とは集合(set)オブジェクト
同じ値の要素はない。
要素には順番が無い。

>>>number = {10, 20, 30, 40, 50}
>>>number
{40, 10, 50, 20, 30}

 


同じ値の要素はない。
>>>number = {10, 30, 50, 30}
>>>number
{10, 50, 30}


リストやタプルから集合を作る事が出来る。
>>>number = set([10, 30, 50, 30])
>>>number
{10, 50, 30}

 

>>>number = {10, 30, 50}
>>>for i in number:
...    print(i)
...
10
50
30

 

 


|  和集合
&  積集合
-  差集合
^  排他OR

 

Setオブジェクトは、論理和(union)、論理積(intersection)、差(difference)、排他的論理和(symmetric difference)

和集合
>>>s1 = {"a", "b", "c", "d", "e"}
>>>s2 = {"d", "e", "f"}
>>>s1 | s2
{'e', 'f', 'b', 'a', 'c', 'd'}

 


積集合
>>>s1 = {"a", "b", "c", "d", "e"}
>>>s2 = {"d", "e", "f"}
>>>s1 & s2
{'d', 'e'}

 


差集合
>>>s1 = {"a", "b", "c", "d", "e"}
>>>s2 = {"d", "e", "f"}
>>>s1 - s2
{'b', 'c', 'a'}

 

 

排他OR
>>>s1 = {"a", "b", "c", "d", "e"}
>>>s2 = {"d", "e", "f"}
>>>s1 ^ s2
{'f', 'b', 'a', 'c'}

 


****************************************
辞書
****************************************

辞書は、辞書(dict)オブジェクトで、要素が「キー」と「値」のペアになっている。
『key:value』の形式で記述する。


>>>number = {'いち':'One', 'に':'Two', 'さん':'tree'}
>>>number['に']
'Two'


書き換え
>>>number['に']='second'
>>>rumber
{'いち':'One', 'に':'second', 'さん':'tree'}

 

追加
>>>number = {'いち':'One', 'に':'Two', 'さん':'tree'}
>>>number['よん']='four'
>>>rumber
{'いち':'One', 'に':'Two', 'さん':'tree', 'よん':'four'}

dict関数で辞書を作成することが出来ます。
キーは引用符で囲みません。
>>>number = dict(いち='One', に='Two')
>>>number
{'いち': 'One', 'に': 'Two'}

 

>>>number = []
>>>for x in range(10):
...    number.append(x)
...
>>>print(number)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

>>>number = [x for x in range(10)]
>>>print(number)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

>>>def func(**x):
...    print(x)
...
>>>func(じゅう = 10, にじゅう = 20, さんじゅう = 30)
{'じゅう': 10, 'にじゅう': 20, 'さんじゅう': 30}


1から5までの数字を使って、1から5までのそれぞれの二乗を
>>>num = {x : x **2 for x in (1, 2, 3, 4, 5)}
>>>print(num)
{1: 4, 2: 4, 3: 9, 4: 16, 5: 25}


>>>num[99] = 100
>>>print(num)
{1: 4, 2: 4, 3: 9, 4: 16, 5: 25, 99: 100}


>>>

>>>fruit = {'one': 'いちご', 'two': 'りんご', 'tree': 'みかん'}
>>>print(fruit)
{'one': 'いちご', 'two': 'りんご', 'tree': 'みかん'}


>>>del fruit['two']
>>>print(fruit)
{'one': 'いちご', 'tree': 'みかん'}


キーがあるかどうか調べる例
>>>fruit = {'one': 'いちご', 'two': 'りんご', 'tree': 'みかん'}
>>>'two' in fruit
True

キーの一覧を見る
>>>fruit.keys()
dict_keys(['one', 'two', 'tree'])


値の一覧を見る
>>>fruit.values()
dict_values(['いちご', 'りんご', 'みかん'])


キーと値の一覧
>>>fruit.items()
dict_items([('one': 'いちご'), ('two': 'りんご'), ('tree': 'みかん')])


list関数でリストを作る
>>>list(fruit.keys())
['one', 'two', 'tree']


tuple関数でタプルを作る
>>>tuple(fruit.keys())
('one', 'two', 'tree')

 


****************************************
コレクション型を組み合わせる
****************************************

コレクション肩は、組み合わせることが出来ます。

>>>data=[{'a':'いちご', 'b':'りんご'}, {'c':'みかん', 'd':'かき'}]
>>>data[0]['b']
'りんご'