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']
'りんご'