コンテンツにスキップ

第2回:コレクション型と基本型の性質

リストの復習

listクラスの主なメソッド

メソッド 説明
append(x) 末尾に x を追加する
insert(i, x) 位置 ix を挿入する
remove(x) 最初の x を削除する
pop() 末尾を取り出し削除する
clear() 全要素を削除する
index(x) x のインデックスを返す
count(x) x の出現回数を返す
reverse() 順序を反転する
a = [10, 20, 30, 40]
a.append(100)   # [10, 20, 30, 40, 100]
a.pop()          # 100 が返り、a は [10, 20, 30, 40]
a.reverse()      # [40, 30, 20, 10]
a.index(20)      # 2

メソッド以外のリスト操作

a = [10, 20, 30, 40]
del a[1]            # [10, 30, 40]
a = a + [0, 1]      # [10, 30, 40, 0, 1]
1 in a              # True
2 in a              # False
len(a)              # 5
sorted(a)           # [0, 1, 10, 30, 40]
sorted(a, reverse=True)  # [40, 30, 10, 1, 0]

sort() と sorted() の違い

a.sort() はリスト a 自身を直接並び替える(破壊的操作)。一方、sorted(a) は元のリストを変更せず、ソート済みの新しいリストを返す(非破壊的操作)。

リストを含むリスト

data = [[1, 2], [3, 4, 5]]
data[0][0]   # 1  先頭のリストの先頭
data[0][1]   # 2  先頭のリストの2番目
data[1][0]   # 3  2番目のリストの先頭
data[1][2]   # 5  2番目のリストの3番目

アクセス方法

ネストしたリストの個々の要素にアクセスするには、インデックスを2回指定する。data[外側][内側] の形で、まず外側のリストを選び、次に内側のリストの要素を選ぶ。

タプル

タプル(tuple)は、リストと同様に複数の要素を格納するコレクションである。

リスト vs タプル

# リスト: 要素を変更できる
a = [1, 2, 3, 4]
a[0] = 99  # OK → [99, 2, 3, 4]

# タプル: 要素を変更できない
a = (1, 2, 3, 4)
a[0] = 99  # エラー! TypeError

()の省略とアンパック代入

# タプルの作成時に()を省略できる
a = 1, 2, 3, 4
# → (1, 2, 3, 4)

# アンパック代入: 複数の変数へ1つずつ値を代入
a, b, c = (1, 2, 3)
# a=1, b=2, c=3

# 複数の変数への一括代入
x, y, z = 1, 3, 9
# x=1, y=3, z=9

辞書

辞書(dict)は、キーと値のペアを格納するコレクションである。インデックスの代わりにキーを使って値を取得できる。

info = {'firstname': '太郎', 'lastname': '山田', 'address': '茨城県つくば市 99-99'}
info['firstname']  # '太郎'

辞書の要素の取得

# keys() - すべてのキー
for k in info.keys():
    print(k)

# values() - すべての値
for v in info.values():
    print(v)

# items() - すべての要素(キーと値のペア)
for i in info.items():
    print(i)
# ('firstname', '太郎') etc.

辞書の操作

info.get('firstname')    # '太郎'
info.get('tel')          # None(エラーにならない)
info['tel'] = '090-000-0000'  # 追加
del info['tel']          # 削除
len(info)                # 3
'age' in info            # False
'firstname' in info      # True

辞書の要素の並べ替え

data = {'b': 5, 'c': 2, 'a': 8, 'd': 7}
print(sorted(data.items()))
# [('a', 8), ('b', 5), ('c', 2), ('d', 7)]

# key=lambda で値を基準にソート
print(sorted(data.items(), key=lambda x: x[1]))
# [('c', 2), ('b', 5), ('d', 7), ('a', 8)]

セット

セット(set)は値を格納するコレクションで、要素の重複を許さず、順序を持たない。

  • リストは [1, 2, 3]
  • タプルは (1, 2, 3)
  • セットは {1, 2, 3}
a = {'A', 'B', 'C', 'D'}
a = {'A', 'B', 'B', 'C', 'C', 'C'}
# → {'A', 'B', 'C'}  ← 重複は1つにまとまる

セットの操作

data = [1, 2, 3]
a = set(data)      # {1, 2, 3}
set1 = {'A', 'B', 'C'}
set2 = {'B', 'C'}
set2.issubset(set1)  # True

セットどうしの演算(集合演算)

演算子 演算 説明
\| 和集合 どちらか一方に含まれる要素
& 積集合 両方に含まれる要素
- 差集合 set1にあってset2にない要素
^ 排他的論理和 どちらか一方にだけ含まれる要素
set1 = {'A', 'B', 'C'}
set2 = {'A', 'B', 'D'}
set1 | set2   # {'A', 'B', 'C', 'D'}
set1 & set2   # {'A', 'B'}
set1 - set2   # {'C'}
set1 ^ set2   # {'C', 'D'}

基本型の性質

Pythonの基本型には3つの性質がある:ミュータブルイテラブルシーケンス

説明 変更可能(ミュータブル) 反復可能(イテラブル) 順序を持つ(シーケンス)
int, float, bool 数値、真偽値 x x x
str 文字列 x o o
list リスト o o o
tuple タプル x o o
dict 辞書 o o x
set 集合 o o x

ミュータブルとイミュータブル

  • ミュータブル: list, dict, set → 値を変更できる
  • イミュータブル: int, float, bool, str, tuple → 値を変更できない(オブジェクトそのものを取り換えないと値を変えられない)
# イミュータブル: id()が変わる
a = 2
id(a)     # 140735461447360
a = 3
id(a)     # 140735461447392  ← 別のオブジェクト

# ミュータブル: id()が変わらない
a = [1, 2, 3]
id(a)     # 2103730545344
a[0] = 3
id(a)     # 2103730545344  ← 同じオブジェクト

反復可能なオブジェクト(イテラブル)

for構文で1つ1つの要素を参照できるオブジェクトをイテラブルという。str, set, tuple, list, dictがイテラブルである。

for a in 'Python':
    print(a)
# P, y, t, h, o, n

for a in {1, 2, 3}:
    print(a)

順序を持つオブジェクト(シーケンス)

a[0], a[1] のようにインデックスで要素を参照できるオブジェクトをシーケンスという。str, list, tupleがシーケンスである。

a = 'Python'
a[2]      # 't'

a = (1, 2, 3)
a[2]      # 3

スライス式

シーケンスは a[start:end] の形式で部分的に取り出すことができる。

a = 'Python'
a[1:3]    # 'yt'

a = (0, 1, 2, 3, 4)
a[2:5]    # (2, 3, 4)

# start/endの省略
a = 'Python'
a[:3]     # 'Pyt'
a = (0, 1, 2, 3, 4)
a[2:]     # (2, 3, 4)

授業内演習

任意のリスト data を用意して、リストの各要素の値とリストの要素数を出力するプログラムを作成しなさい。

基本課題

キーボードからリストの数値 val とインデックス n を入力し、あるリスト datan 番目の要素を数値 val で置き換えるプログラムを作成しなさい。

キーボードからの数値入力

a = int(input('入力してください')) のように input()int() を組み合わせることで、キーボードから整数値を入力できる。

応用課題

あるリスト data に対して、キーボードから入力したリストのインデックス以降の要素を全て0に置き換えるプログラムを作成しなさい。