Python、はじめました

非IT系私文卒リーマン vs Python の全記録

【初めてのPython(第8章)】リストとディクショナリ

f:id:pokita:20180426195830j:plain

 

リスト(list)

8.1

リストオブジェクトとは、シーケンスを持ちmutable(可変)という特徴がある。また、リストが保持しているのは、オブジェクトのリファレンスの配列であり、オブジェクト自身ではない。そのため、変数を入れる際は注意する必要がある

a = 1
L1 =[0,a,2]
#変数aはあくまでもint 1へのリファレンス
a = 3
print(L1)
>>>[0,1,2]
#L1[1]はあくまでもint 1へのリファレンスであり、変数aが上書きされようとも、リストLが直接上書きされない限りはその内容は変わらない。

L1[1] = a
#L1が表すリファレンス先の内容を直接上書きした。

print(L1)
>>>[0,3,2]

L2 = [0,L1,2]
L1[1] = 1
#L1が表すリファレンス先の内容を直接上書きした。
print(L2)
>>>[0,[0,1,2],2]

8.2.3

リストオブジェクトはmutableの性質であることから、変更を加える際はそれが上書きになるのか新設になるのか注意しなければならない。インデックスの指定やメソッドを使った変更は上書きであり、それ以外の演算子のみを使った変更は新設にあたる。

L1 =[0,1,2]
print(id(L1))
>>>79317192
L1[2] = 2
print(id(L1))
>>>79317192
L1 = [2,2,2]
print(id(L1))
>>>79318312

 

ディクショナリ(dictionary)

8.3

ディクショナリオブジェクトとは、キーを持ちmutable(可変)という特徴がある。また、要素は一定の順列を持っていないため、連結やスライシング等の操作はできない。

また、ディクショナリが保持しているのは、オブジェクトのリファレンスの配列であり、オブジェクト自身ではない。そのため、変数を入れる際は注意する必要がある。

D = {"age":27,"sex":"man","name":"Pokio"}

上記の青字、:の左側をキー、:の右側をという。キーにはimmutableなオブジェクトした使うことができないが、値にはすべてのオブジェクトを使うことができる。

 

8.4.1

 ディクショナリの演算子とメソッドについて。まず、174pに書いてある、dict.has_keyメソッドはPython3.0から存在しなくなった。(いつものことだね。)object in dict演算子が同じ働くをするからである。

 

8.4.2

ディクショナリの上書きは左辺でキーを指定して行う。指定されたキーが存在しないものだと、キーと値の追加になる。

D = {"age":27,"sex":"man","name":"Pokio"}
D["age"] = 28
#値の上書き
print(D)
>>>{"age":28,"sex":"man","name":"Pokio"}
D["occupation"] = "servant"
#キーと値の追加

print(D)
>>>{"age":28,"sex":"man","name":"Pokio","occupation":"servant"}

リストの場合だと、上書きは代入でできるものの、追加はappendメソッドを使う以外にはない。なぜなら、存在しないオフセットを指定することはできないから。(スライシングの高度テクニックで追加できました。)

#スライシング高等テクニック(sequenceの末尾:)によるリストの追加
L = [0,1,2]
L[3] = 3
print(L)
>>>IndexError: list assignment index out of range
L[len(L):] = 3
print(L)
>>>[0,1,2,3]

 

8.4.3

ぼくがけっこう苦労した箇所。苦労については下記の記事へ。

 

keys()や.values()メソッドが本書では「listを返す」とあるが、Python3.0以降ではviewオブジェクトというsetオブジェクトのようなものを返すようになった。

4. 組み込み型 — Python 3.6.5 ドキュメント

L1 = ["a","b","c","d","e"]
L2 = [75,4,3,2,1]
D = dict(zip(L1,L2))
K =D.keys()
print(K)
>>>dict_keys(["a","b","c","d","e"])

 

8.4.4

”ディクショナリはシーケンスではありません。そのため、文字列やリストの場合のように単純にforステートメントを使用しても、要素一つ一つに順にアクセスすることはできません。"

からの

”for key in D.keys()と書く代わりに、for key in Dと書いても同じ結果が得られるのです。このように、ディクショナリに対してin演算子を使ってキーのリストにアクセスできるのは、先述の通り、「イテレータ」が定義されているからです。

どっちなんだよ……。実際に動かしてみる。

L1 = [1,2,3,4,5]
L2 = [75,4,3,2,1]
D = dict(zip(L1,L2))
print(D)
for i in D:
   print(i)
>>>1
2
3
4
5

なんだ普通にできるじゃん。ディクショナリのキーがイテレーションされた。これはhelp(dict)で見れば分かるように、dictクラスには__iter__が定義されているからだ。

 

今回はここまで。