05_Pythonノート記録_#タプル #辞書

04の続き

<用語>

#シーケンス:順番に並んでいること
#シーケンス型:配列やリストのように順番に処理するデータ構造、pythonでいう「文字列、リスト、タプル、range」を言う

<タプル>

#書式

変数 = 値, 値, 値, 値,... 値
#数値型を文字列型が混合していてもOK#

#例

c = 10, 20, "APPLE", "car"
print(c) 
↓
(10, 20, 'APPLE', 'car')
#タプルとリストの違い
タプル:丸括弧がつく、不変型(immutable)、複数の型でも大丈夫、アンパック操作やインデックスでアクセス
リスト:角括弧がつく、変更可(mutable)、同一の型、イテレートでアクセス
イテレート:繰り返し処理
アンバック:まだよくわからない

#タプルを追加

#丸括弧でくくらない
c = c, 1, 2, 3
↓
((10, 20, 'APPLE', 'car'), 1, 2, 3)

#丸括弧でくくる
c = c, (1,2,3)
↓
((10, 20, 'APPLE', 'car'), (1, 2, 3))

#中身を取り出したい

c = ((10, 20, 'APPLE', 'car'), (1, 2, 3))
c[0][1]
↓
20

#本当に中身を変えることはできないのか

c = ((10, 20, 'APPLE', 'car'), (1, 2, 3))
c[0][1] = 600SyntaxError: keyword can't be an expression

《観察》
できない模様。

#0個から成るタプル_変数に()を代入

kara = ()
↓
()

#1個から成るタプル_おしりに,

ikko = "book",
↓
('book',)

#タプルやリストのアンパック_例

coin = 1, 5, 10, 50, 100, 500
a, b, c, d, e, f = coin
print(a,b,c,d,e,f)
↓
1 5 10 50 100 500

《観察》
シーケンス型(タプルやリスト)に代入されている値の数と同じ数の変数を用意し、
左辺に変数 イコール 右辺にシーケンス型の変数
とすることで、複数の変数に同時に値を代入することができる。これをシーケンスのアンパックと呼ぶ。
上記#例の場合、タプルのパック(変数coin)とシーケンスのアンパックをを組み合わせて、a~fに硬貨を割り当てた。

《ハック》
#リストでもやってみる

jap = ["わ", "び", "さ", "び"]
q,w,e,r = jap
print(q,w,e,r)
↓
わ び さ び

#リストやタプルの複合ならどうか

AAA = [[123,456],[789,741,852,963]]
b,c = AAA
print(b,c)  #---1

q,w,e,r = AAA[1]
print(q,w,e,r) #---2
↓
[123, 456] [789, 741, 852, 963] #--1

789 741 852 963 #--2

《観察》
AAAの中身を全て分解して異なる変数に入れようと思ったができなかった。

<辞書型>

#書式

変数 = {キー:値, キー:値, キー:値,...キー:値}

#例

root = {"車":120, "電車":135, "自転車":250, "徒歩":3120}
print(root)
print(root["車"])
↓
{'電車': 135, '車': 120, '自転車': 250, '徒歩': 3120} #順番はランダム
120

《観察》
インデックス番号でアクセス使用とすると...

print(root[0])
↓
TypeError: 'builtin_function_or_method' object is not subscriptable

#辞書を追加

root = {"車":120, "電車":135, "自転車":250, "徒歩":3120}
root["飛行機"] = 60
print(root)
↓
{'自転車': 250, '飛行機': 60, '電車': 135, '徒歩': 3120, '車': 120}

《観察》
追加するときは波括弧じゃなくて丸括弧らしい。なんでやねん

#キーを抽出してリスト化する

#ソースせずに抽出するlist(d.keys())
root = {"車":120, "電車":135, "自転車":250, "徒歩":3120}
print( list(root.keys()) )
↓
['徒歩', '車', '自転車', '電車']

#ソースして抽出
root = {"車":120, "電車":135, "自転車":250, "徒歩":3120}
print( sorted(root.keys()) )
↓
['徒歩', '自転車', '車', '電車'] #あいうえお順かな?

#キーと値のペアであるタプル、を含むリストから辞書を作成する dict.([()])

#タプルを作成
tap1 = ("apple", 100)
tap2 = ("banana", 200)
tap3 = ("orange", 150)

#タプルをリスト化
list1 = []
list1.append(tap1)
list1.append(tap2)
list1.append(tap3)

#リストから辞書を作成
di1 = dict(list1)
print(di1)
↓
{'orange': 150, 'banana': 200, 'apple': 100}

#辞書の内包表記

dic2 = { a : a*b for a in range(1,10) for b in (9,10)}
print(dic2)
↓
{1: 9, 2: 18, 3: 27, 4: 36, 5: 45, 6: 54, 7: 63, 8: 72, 9: 81}


《観察》
九九を1~9の段をキーに:各段の九つ目を値に。
むずい

#ループにおいて、辞書のキーとその値を同時に取り出すことができる。.items()メソッド
#例

pants = {"white":100, "black":200, "yellow":1300}
for x,y in pants.items():
	print(x,y)
↓
black 200
yellow 1300
white 100

#シーケンス型において、インデックス番号と値を同時に取り出すことができるenumerate()関数

pants = {"white":100, "black":200, "yellow":1300}
for x,y in enumerate(pants):
	print(x,y)
0 white
1 yellow
2 black

《観察》
今回は辞書型で試したので、値(whiteなど)の順番は毎回ランダム

#タプルでためしてみる

a = 1,2,3,4,5
for x,y in enumerate(a):
	print(x,y)
↓
0 1
1 2
2 3
3 4
4 5

#シーケンス型をソートしてループする sorted()

a = 20,31,45,1,9,56,3021,4
for b in sorted(a):
	print(b)
↓
1
4
9
20
31
45
56
3021

#辞書だとどうなる?

a = {"G":65, "A":10, "D":98}
for b in sorted(a):
	print(b)
↓
A
D
G #キーがソートされた

《観察》
sorted()は、元のシーケンス型の変数の順序を変えずに、
新たにソート済みのものを返してくれる。

#シーケンス型を逆順にループさせる reversed()関数

for a in reversed(range(1,100,25)):
	print(a)
↓
76
51
26
1

5-7 条件についてもうすこし までやった
https://docs.python.jp/3/tutorial/datastructures.html#tut-loopidioms