【入門 Python】リスト、タプル、辞書、集合
はじめに
この記事では主に、株式会社オライリー・ジャパンの「入門 Python3」を中心に学んだことを備忘録目的でまとめていきます。参考書籍と必ずしもセクションが同じとは限りませんので、あらかじめご承知おきください。基本的に知識まとめの文章表現は常体(だ・である調)で表現しています。
【リンク紹介】
・ 入門 Pythonのまとめ記事一覧
・ これまで書いたシリーズ記事一覧
参考書籍について
より詳しく内容を知りたい方は「入門 Python3」をお手に取ってみてください。なお、最新版(第2版)はこちら。
Pythonの実行環境について
この記事ではPython付属の対話型インタープリタを用いることとします。起動方法はシェル(windows:コマンドプロンプト, Mac:zshなど)に次のように入力すると起動できます。
# Pythonと入力すると対話型インタープリタが起動
C:\Users\user>Python
Python 3.11.1 (tags/v3.11.1:a7a450f, Dec 6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
なお、対話型インタープリタの修了方法はquit()
を入力すると終了します。
>>> quit()
C:\Users\user>
1. リスト
リストはミュータブルなシーケンス構造である。つまり要素を順番に管理し、要素の挿入と削除を行うことができる。
シーケンスとは、順番に並んだ一続きのデータや手順のことを意味する。(「IT用語辞典」より)
1.1. リストの作成
# 空のリストも作成可能
>>> empty_list = []
>>> empty_list
[]
# list()関数でも空のリストは作成可能
>>> empty_list = list()
>>> empty_list
[]
# 各要素はカンマで区切る
>>> day_of_week
['Monday', 'Tueseday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
1.1.1. リストの要素としてのリスト
リストの要素にリストを用いることができる。
>>> list_in_list = ['zero', 'one', 'two', 'three', ['four', 'five']]
>>> list_in_list
['zero', 'one', 'two', 'three', ['four', 'five']]
1.1.2. タプルの要素としてのリスト
リストの要素としてタプルを用いることができる。
>>> tuple_in_list = ['zero', 'one', 'two', 'three', ('four', 'five')]
>>> tuple_in_list
['zero', 'one', 'two', 'three', ('four', 'five')]
1.1.3. 多次元配列
リストの要素がブール値、整数、浮動小数点数、文字列のみであるとき、そのリストを1次元配列という。また、リストの要素が一次配列であるとき、そのリストを2次元配列という。このように帰納的に3次元配列や4次元配列も作ることができ、これらの配列をまとめて多次元配列という。
# 1次元配列
>>> one_dimensional_array = [0, 1, 2]
>>> one_dimensional_array
[0, 1, 2]
# 2次元配列
>>> two_dimensional_array = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
>>> two_dimensional_array
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
1.2. 他のデータ型をリストへの変換:list()
# 引数に文字列を入れると、1文字ごとの文字列リストに変換される。
>>> list('Monday')
['M', 'o', 'n', 'd', 'a', 'y']
# 引数にタプルを入れると、リストに変換される。
>>> day_of_week_tuple = ('Monday', 'Tueseday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
>>> list(day_of_week_tuple)
['Monday', 'Tueseday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
<!--
タプルについてはこちら
-->
1.3. [offset]操作
1.3.1. 要素の取り出し
文字列と同じようにオフセットを用いて要素を取り出すことができる。
>>> offset_list = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> offset_list[0]
'zero'
>>> offset_list[2]
'two'
1.3.2. 要素の書き換え
>>> offset_list = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> offset_list[3] = 3
>>> offset_list
['zero', 'one', 'two', 3, 'four', 'five']
1.4. スライス操作
文字列の時のようにスライス[start:end:step]
操作ができる。
>>> offset_list = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> offset_list[1:4]
['one', 'two', 'three']
>>> offset_list[0:7:2]
['zero', 'two', 'four']
1.5. 要素を追加:append(), insert()
1.5.1. append()関数
append()関数を使うと、リストの最後に要素を追加する。
>>> numbers = ['zero', 'one', 'two', 'three']
>>> numbers.append(4)
>>> numbers
['zero', 'one', 'two', 'three', 4]
ただし引数にリストを入れると、そのリストを要素として追加するので注意。
>>> numbers = ['zero', 'one', 'two', 'three']
>>> numbers.append([4, 5])
>>> numbers
['zero', 'one', 'two', 'three', [4, 5]]
1.5.2. insert()関数
insert関数はappend()関数と違い引数にオフセットを指定すると、リストの任意の場所に要素を追加することができる。末尾を超えるオフセットはリストの末尾に追加される。
# insert(offset, 要素)
>>> numbers = ['zero', 'one', 'two', 'three']
>>> numbers.insert(2, 'added_element')
>>> numbers
['zero', 'one', 'added_element', 'two', 'three']
+=
1.6. リストの結合:extend(), 1.6.1. extend()関数
extend()関数を使うと、2つのリストを1つにまとめる。
>>> first = ['first_zero', 'first_one', 'first_two']
>>> second = ['second_zero', 'second_one', 'second_two']
>>> first.extend(second)
# 引数のリストの要素を後ろに追加する
>>> first
['first_zero', 'first_one', 'first_two', 'second_zero', 'second_one', 'second_two']
# 引数のリストの方には変化なし
>>> second
['second_zero', 'second_one', 'second_two']
+=
1.6.2. extend()関数と同じ結果を得る。
>>> first = ['first_zero', 'first_one', 'first_two']
>>> second = ['second_zero', 'second_one', 'second_two']
>>> first += second
# 引数のリストの要素を後ろに追加する
>>> first
['first_zero', 'first_one', 'first_two', 'second_zero', 'second_one', 'second_two']
# 引数のリストの方には変化なし
>>> second
['second_zero', 'second_one', 'second_two']
1.7. 要素の削除:del, remove(), pop()
1.7.1. del
オフセットを指定すると、その要素を削除する。
>>> numbers = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> del numbers[2]
>>> numbers
['zero', 'one', 'three', 'four', 'five']
1.7.2. remove()関数
オフセットがわからない場合などは、remove()関数を使って値を指定して削除することができる。
>>> numbers = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> numbers.remove('two')
>>> numbers
['zero', 'one', 'three', 'four', 'five']
1.7.3. 要素を取り出し、かつ削除する:pop()
引数にオフセットを指定するとその要素を取り出してリストからは削除する。引数を指定しない場合はオフセットは
>>> numbers = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> numbers.pop(2)
'two'
>>> numbers
['zero', 'one', 'three', 'four', 'five']
1.8. 要素の値から要素のオフセットを知る:index()
引数に要素の値を指定すると、リスト内のオフセットを返す。
>>> numbers = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> numbers.index('three')
3
1.9. 値の有無を判定:in
in
を使えばリストの中に値があるかどうかを判定できる。ブール値が返り値。
>>> numbers = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> 'two' in numbers
True
>>> 'six' in numbers
False
1.10. 値の個数の計算:count()
引数に個数を数えたい要素を指定する。
>>> colors = ['red', 'green', 'green', 'yellow', 'yellow', 'yellow']
>>> colors.count('green')
2
1.11. 文字列への変換:join()
文字列の結合を参照。
1.12. 要素の並べ替え:sort(), sorted()
sort()関数はリスト関数であり、引数のリストそのものを並べ替える。
# 整数のリスト
>>> numbers = [4, 2, 0, 3, 1]
>>> numbers.sort()
>>> numbers
[0, 1, 2, 3, 4]
# 降順にするときは引数にreverse=Trueを記述する
>>> numbers = [4, 2, 0, 3, 1]
>>> numbers.sort(reverse=True)
>>> numbers
[4, 3, 2, 1, 0]
# 文字列のリスト
>>> letters = ['dog', 'cat', 'age', 'egg', 'boy']
>>> letters.sort()
>>> letters
['age', 'boy', 'cat', 'dog', 'egg']
# 降順にするときは引数にreverse=Trueを記述する
>>> letters = ['dog', 'cat', 'age', 'egg', 'boy']
>>> letters.sort(reverse=True)
>>> letters
['egg', 'dog', 'cat', 'boy', 'age']
sorted()関数は汎用関数であり、引数のリストのコピーを並べ替えて、その並べ替えたコピーを返り値とする。
# 整数のリスト
>>> numbers = [4, 2, 0, 3, 1]
>>> sorted_numbers = sorted(numbers)
>>> sorted_numbers
[0, 1, 2, 3, 4]
# 文字列のリスト
>>> letters = ['dog', 'cat', 'age', 'egg', 'boy']
>>> sorted_letters = sorted(letters)
>>> sorted_letters
['age', 'boy', 'cat', 'dog', 'egg']
1.13. 長さの取得:len()
>>> list = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> len(list)
6
1.14. リストのコピー
リストのコピーは以下の2通りで可能である。
- リストのcopy()関数
- list()変換関数
- リストスライス[:]
# リストのcopy()関数
>>> letters = ['zero', 'one', 'two', 'three']
>>> letters_copy_func = letters.copy()
>>> letters_copy_func
['zero', 'one', 'two', 'three']
# list()変換関数
>>> letters = ['zero', 'one', 'two', 'three']
>>> letters_list_func = list(letters)
>>> letters_list_func
['zero', 'one', 'two', 'three']
# リストスライス[:]
>>> letters = ['zero', 'one', 'two', 'three']
>>> letters_slice = letters[:]
>>> letters_slice
['zero', 'one', 'two', 'three']
2. タプル
タプルはイミュータブルなシーケンス構造である。つまり要素を順番に管理し、要素の挿入と削除を行うことはできない。
2.1. タプルの作成
タプルは値を区切るカンマで定義されているが、視認性を考えると括弧()
で囲むのが良い。
# 空のタプルも作成可能
>>> empty_tuple = ()
>>> empty_tuple
()
# 通常は要素を括弧で囲って記述する
>>> day_ot_week = ('Monday', 'Tueseday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
>>> day_ot_week
('Monday', 'Tueseday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
# 実際にタプルを定義しているのは括弧ではなくカンマ
>>> day_ot_week = 'Monday', 'Tueseday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'
>>> day_ot_week
('Monday', 'Tueseday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
2.2. タプルの特徴
タプルには以下の特徴がある。
- タプルは消費スペースが小さい
- タプルの要素は書き換える可能性がない
- タプルは辞書のキーとして使うことができる
- 名前付きタプルはオブジェクトの代用品として使うことができる
- 関数の引数はタプルとして渡される
3. 辞書
辞書は要素の順序がなく、個々の値にキー(key)を付与する。他の言語では連想配列、ハッシュ、ハッシュマップとも呼ばれる。
3.1. 辞書の作成
# 空の辞書も作成できる
>>> empty_dict = {}
>>> empty_dict
{}
# key: valueのペアをカンマで区切り、波括弧{}で囲む
>>> sample_dict = {
... 'one': 'red',
... 'two': 'green',
... 'three': 'yellow'
... }
>>> sample_dict
{'one': 'red', 'two': 'green', 'three': 'yellow'}
リストを値に持つ辞書を作成することもできる。
# リストの準備
>>> Impressionism = ['Claude Monet', 'Vincent van Gogh']
>>> Realism = ['Jean-François Millet', 'Gustave Courbet']
# 辞書の作成
>>> composer = {
... 'Impressionism': Impressionism,
... 'Realism': Realism,
... }
>>> composer
{'Impressionism': ['Claude Monet', 'Vincent van Gogh'], 'Realism': ['Jean-François Millet', 'Gustave Courbet']}
3.2. dict()を使った変換
引数に次元が2次元以上の配列のリストやタプルを渡すことで、辞書に変換することができる。
# リストのリスト
>>> list_in_list = [['a', 'b'], ['c', 'd']]
>>> dict(list_in_list)
{'a': 'b', 'c': 'd'}
# タプルのリスト
>>> list_in_tuple = (['a', 'b'], ['c', 'd'])
>>> dict(list_in_tuple)
{'a': 'b', 'c': 'd'}
# リストのタプル
>>> tuple_in_list = [('a', 'b'), ('c', 'd')]
>>> dict(tuple_in_list)
{'a': 'b', 'c': 'd'}
# タプルのタプル
>>> tuple_in_tuple = (('a', 'b'), ('c', 'd'))
>>> dict(tuple_in_tuple)
{'a': 'b', 'c': 'd'}
1次元配列でも辞書に変換することができるが、変換結果は以下のようになる。
# 2文字からなる配列の場合は辞書に変換可能
>>> letters = ['ab', 'cd']
>>> dict(letters)
{'a': 'b', 'c': 'd'}
# 3文字からなる配列の場合はエラー
>>> letters = ['abc', 'def']
>>> dict(letters)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required
3.3. 要素の追加、変更:[key]
キーを使って要素を参照し、値を代入する。辞書にそのキーがある場合はすでにある値が新しい値に置き換わる。
>>> composer = {
... 'Franz': 'Liszt',
... 'Felix': 'Mendelssohn',
... 'Frédéric': 'Chopin',
... }
>>> composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin'}
# 要素の追加
>>> composer['Maurice'] = 'Ravel'
>>> composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin', 'Maurice': 'Ravel'}
3.4. 辞書の結合:update()
update()関数は、辞書のキーと値を別の辞書にコピーして結合する。
>>> first_dict = {
... 'one': 'first_one',
... 'two': 'first_two',
... 'three': 'first_three',
... }
>>> second_dict = {
... 'three': 'second_three',
... 'four': 'second_four',
... }
# 辞書の結合
>>> first_dict.update(second_dict)
# 同じキーがある場合、引数の値が採用される。
>>> first_dict
{'one': 'first_one', 'two': 'first_two', 'three': 'second_three', 'four': 'second_four'}
# コピーするだけなので、引数の辞書は変化なし
>>> second_dict
{'three': 'second_three', 'four': 'second_four'}
3.5. 要素の削除:del, clear()
3.5.1. del
キーを指定すると、そのキーに紐づいた値を削除する。
>>> composer = {
... 'Franz': 'Liszt',
... 'Felix': 'Mendelssohn',
... 'Frédéric': 'Chopin',
... 'Maurice': 'Ravel',
... }
# 削除したい値のキーを指定
>>> del composer['Maurice']
>>> composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin'}
3.6. clear()
clear()関数はすべての要素を削除する。
>>> composer = {
... 'Franz': 'Liszt',
... 'Felix': 'Mendelssohn',
... 'Frédéric': 'Chopin',
... 'Maurice': 'Ravel',
... }
>>> composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin', 'Maurice': 'Ravel'}
>>> composer.clear()
>>> composer
{}
3.7. 値の有無を判定:in
in
を使えば辞書の中にキーがあるかどうかを判定できる。ブール値が返り値。
>>> composer = {
... 'Franz': 'Liszt',
... 'Felix': 'Mendelssohn',
... 'Frédéric': 'Chopin',
... 'Maurice': 'Ravel',
... }
>>> 'Franz' in composer
True
>>> 'Bach' in composer
False
3.8. [key]による要素の取得
>>> composer = {
... 'Franz': 'Liszt',
... 'Felix': 'Mendelssohn',
... 'Frédéric': 'Chopin',
... 'Maurice': 'Ravel',
... }
>>> composer['Franz']
'Liszt'
# キーがなかった場合はエラー
>>> composer['Bach']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Bach'
3.9. 要素の取得:keys(), values(), items()
3.9.1. すべてのキーの取得:keys()
keys()関数は、辞書のすべてのキーを取得できる。返り値はdict_keysオブジェクトというビューオブジェクトで、辞書を参照するのでリストを作成するよりメモリ効率がよく、辞書のデータが大きい場合でも軽量である。
>>> composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin', 'Maurice': 'Ravel'}
>>> composer.keys()
dict_keys(['Franz', 'Felix', 'Frédéric', 'Maurice'])
for文に辞書を使うとき、そのまま辞書を使うこともできるが、明示的にkeys()関数を用いることで視認性が向上するという主張もある。Pyhon 辞書(dict)のループ処理(for)をするときのメソッド(keys(),values(),items())の使用例
参考資料
- keys()
- ビューオブジェクト
3.9.2. すべての値の取得:values()
values()関数は、辞書のすべての値を取得でき、返り値はdict_valuesオブジェクトというkeys()関数と同様のビューオブジェクトである。
>>> composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin', 'Maurice': 'Ravel'}
>>> composer.values()
dict_values(['Liszt', 'Mendelssohn', 'Chopin', 'Ravel'])
参考資料
- values()
3.9.3. すべてのキー/値ペアの取得:items()
values()関数は、辞書のすべてのキーと値の組を取得でき、返り値はdict_itemsオブジェクトというkeys()関数と同様のビューオブジェクトである。
>>> composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin', 'Maurice': 'Ravel'}
>>> composer.items()
dict_items([('Franz', 'Liszt'), ('Felix', 'Mendelssohn'), ('Frédéric', 'Chopin'), ('Maurice', 'Ravel')])
3.10. 辞書のコピー:copy()
>>> original_composer = {'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin', 'Maurice': 'Ravel'}
>>> copy_composer = original_composer.copy()
>>> copy_composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin', 'Maurice': 'Ravel'}
# コピーした辞書をクリア
>>> copy_composer.clear()
>>> copy_composer
{}
# オリジナルには反映されていない
>>> original_composer
{'Franz': 'Liszt', 'Felix': 'Mendelssohn', 'Frédéric': 'Chopin', 'Maurice': 'Ravel'}
4. 集合
4.1. 集合の作成
4.1.1. {}
# 辞書のように中括弧を用いる
>>> numbers = {0, 1, 2, 3, 4, 5}
>>> numbers
{0, 1, 2, 3, 4, 5}
ただし、{}
では空集合は作ることができず、これは空辞書となることに注意。
4.1.2. set()
# 空集合はset()を用いて作成する
>>> empty_set = set()
>>> empty_set
set()
>>> numbers = set({'zero', 'one', 'two', 'three'})
>>> numbers
{'two', 'three', 'zero', 'one'}
4.2. 他のデータ型を集合へ変換:set()
# 文字列
>>> set('abbcccddd')
{'b', 'a', 'c', 'd'}
# リスト
>>> set(['zero', 'one', 'two', 'three'])
{'two', 'three', 'zero', 'one'}
# タプル
>>> set(('zero', 'one', 'two', 'three'))
{'two', 'three', 'zero', 'one'}
# 辞書
>>> set({'zero': 0, 'one': 1, 'two': 2, 'three': 3})
{'two', 'three', 'zero', 'one'}
4.3. 値の有無を判定:in
>>> numbers = {'zero', 'one', 'two', 'three'}
>>> 'two' in numbers
True
>>> 2 in numbers
False
4.4. 組み合わせと演算
&
, intersection()
4.4.1. 積集合: >>> A = {1, 2}
>>> B = {2, 3}
>>> A & B
{2}
>>> A.intersection(B)
{2}
|
, union()
4.4.2. 和集合: >>> A = {1, 2}
>>> B = {2, 3}
>>> A | B
{1, 2, 3}
>>> A.union(B)
{1, 2, 3}
-
, difference()
4.4.3. 差集合: >>> A = {1, 2}
>>> B = {2, 3}
>>> A - B
{1}
>>> A.difference(B)
{1}
^
, symmetric_difference()
4.4.4. 排他的OR: >>> A = {1, 2}
>>> B = {2, 3}
>>> A ^ B
{1, 3}
>>> A.symmetric_difference(B)
{1, 3}
<=
, issubset()
4.4.5. 部分集合: >>> A = {1, 2}
>>> B = {2, 3}
# AはBの部分集合ではない
>>> A <= B
False
# A-{1}はBの部分集合である
>>> A - {1} <= B
True
# AはAの部分集合である(真部分集合ではない)
>>> A <= A
True
<
4.4.6. 真部分集合: >>> A = {1, 2}
>>> B = {2, 3}
# AはBの真部分集合ではない
>>> A < B
False
# A-{1}はBの真部分集合である
>>> A - {1} < B
True
# AはAの真部分集合ではない
>>> A < A
False
>=
, issuperset()
4.4.7. 上位集合: >>> A = {1, 2}
>>> B = {2, 3}
# BはAの上位集合ではない
>>> B >= A
False
# BはAの上位集合である
>>> B >= A - {1}
True
# Bは上位集合である(真上位集合ではない)
>>> B >= B
True
>
4.4.8. 真上位集合: >>> A = {1, 2}
>>> B = {2, 3}
# BはAの真上位集合ではない
>>> B > A
False
# BはAの真上位集合である
>>> B > A - {1}
True
# Bは真上位集合である
>>> B > B
False
参考資料
【書籍】
Python
Java
Discussion