Python リスト / タプル / 辞書 / 集合 使い分けを徹底解説

 前回の記事ではPythonにおける変数について学びました。この記事ではPythonにおける配列(リスト/ タプル / 辞書)の取り扱いについて学習します。特にリストは実際のプログラミングでよく使います。しっかりと使い方を理解しておく必要があります。

この記事を読むことであなたは
・Pythonにおいて配列の役割を果たすリスト, タプル, 辞書とは何か
・各配列の生成方法、使い方
について理解することができます。

リスト

リストの生成

 FortranやC言語における配列に相当するものリストです。[ ]でリストを使うことができます。リストには複数の要素を入れる事ができます。例えば、次のプログラムを見てみましょう。

my_list = [1, 2, 3, 4]

 ここではmy_listという名前のリストを作成し、リストの中に1, 2, 3, 4という4つの数字を入れています。リストには要素を追加したり、削除したりすることが出来ます。リストに要素を追加するにはappendを使います。

my_list.append(5)
print(my_list)

実行結果

[1, 2, 3, 4, 5]

空のリストから生成

 次のプログラムではまず空のリストを[ ]で生成し、そこに要素を追加してリストを作成しています。このパターンの使い方はループ処理との組み合わせでよくあります。

my_list2 = []
my_list2.append("value")
my_list2.append(1)
print(my_list2)

実行結果

['value', 1]

 今回のように、リストの中には数字、文字列など様々な要素を1つのリストに入れることが出来ます。

リストの要素にアクセス

 リストの要素にアクセスするにはインデックスという0から始まる番号でアクセスします。この辺りもFortranやC言語をやられて入れば特に違和感はないかと思います。

# my_list = [1, 2, 3, 4, 5]
print(my_list[0])
print(my_list[1])
print(my_list[-1])

実行結果

1
2
5

 0番目の要素は1が入っている事が分かります。ここで最後の行ではインデックスに-1を指定しています。この場合、最後の要素からアクセスします。-1の場合、最後の要素ですので5が返ってきます。

スライスで複数の要素にアクセスする

 リストの複数の要素にアクセスするにはスライスを使ってアクセスします。次のプログラムを見てください。

print(my_list[1:3])

実行結果

[2, 3]

 スライスは[start: end]のように使います。ここでは(0から数えて), 1番目と2番目の要素が返ってきている事が分かります。実はスライスではstartからendに指定した値の1つ前の要素までを返します。この為、1:3を指定すると3の1つ手前の2番目の要素までを返します。この辺りは少しややこしいので慣れが必要です。また、スライスではどちらかのインデックスを省略する事も出来ます。この場合、どうなるかは説明するより、出力結果を見る方が早いと思います。

print(my_list[:3])
print(my_list[3:])

実行結果

[1, 2, 3]
[4, 5]

 my_list[:3]の場合は0から3の1つ手前まで、my_list[3:]の場合は、3から最後までを返している事が分かります。

リストの要素を削除

 リストの要素を削除するにはappendと対になるpopを使います。次のプログラムを見てみましょう。

my_list.pop()
print(my_list)

実行結果

5
[1, 2, 3, 4]

 このようにリストの末尾から要素が1つ引き抜かれている事が分かります。pop以外にもリストの要素を削除する方法はあります。それが、delremoveです。ここでは記事が長くなりますので、これら2つについては解説を省略します。

タプル

タプルの生成

 リストの使い方さえ理解しておけば、他のタプルや辞書などはその派生形になっています。タプルを作るにはリストの[ ]の代わりに( )を使います。

my_tuple = (1, 2, 3, 4)
print(my_tuple)

実行結果

 (1, 2, 3, 4)

 要素のアクセスの仕方やスライスなどはリストと同じです。それでは、リストと何が違うのでしょうか?実はタプルでは要素を追加したり、削除したりすることが出来ません。次のようにappendしようとするとエラーとなります。

my_tuple.append(5)

実行結果

----> 1 my_tuple.append(5)

AttributeError: 'tuple' object has no attribute 'append'

 この為、タプルは要素数を変更したくないという意図を伝える場合に使います。科学技術計算ではそこまで厳密に要素数の管理をしないことが多い為、リストの方が使用頻度は高いといえます。

リスト タプル間の変換

 リストとタプルは互いに変換することが出来ます。

to_list = list(my_tuple)
to_tuple = tuple(my_list)
print(to_list)
print(to_tuple)

実行結果

[1, 2, 3, 4]
(1, 2, 3, 4)

辞書

 辞書はリストと並んでよく使います。リストやタプルでは要素のアクセスに数字のインデックスを使っていましたが、辞書ではキー(文字列)で要素にアクセスします。

辞書の生成

 次のプログラムでは辞書を生成しています。辞書を作るには { }を用います。

my_dict = {"first": 1, "second": 2, "third": 3}
print(my_dict)

実行結果

{'first': 1, 'second': 2, 'third': 3}

 :(コロン)の左側がキー(key)、右側が値(value)です。

辞書へのアクセス

 値にアクセスするにはキーを使ってアクセスします。

print(my_dict["first"])

実行結果

1

 もし、辞書に載っていない値を指定すると、辞書にその要素が追加されます。次のプログラムを見てください。

my_dict["fourth"] = 4
print(my_dict)

実行結果

 {'first': 1, 'second': 2, 'third': 3, 'fourth': 4}

辞書の使い方

 科学技術計算における辞書の実際の使い方としては、計算条件などを保存するときなどによく活用します。以下のプログラムを見てください。

calc_condition = {"total time step": 10000, "delta t": 0.001, "data output": "Yes"}

 インデックスが数字ではなく、文字列によるアクセスなので、各要素が何を意味しているか分かりやすくなるわけです。

集合

 最後に集合について紹介します。これは名前の通り、要素が何の要素で構成されているか要素の種類を表す配列です。

集合の生成

 集合を作るには{ }を使います。次のプログラムを見てください。

my_set = {1, 2, 3, 4, 3, 2, 4, 1}
print(my_set)

実行結果

{1, 2, 3, 4}

 出力結果を見れば分かりますが、重複する要素が削除されて、何の要素が含まれているかを返しています。この為、使い方としては、繰り返しになりますが、要素がひとまずどんな要素で構成されているのかを調べる時に使います。

まとめ

 本記事ではPythonにおけるリストとその派生形について学習しました。以下に、纏めておきましょう。

リストとは他のプログラミング言語における配列を意味します。

# リストの生成
my_list = [1, 2, 3, 4]

# リストの要素にアクセスするには0から始まるインデックスを使う
my_list[0]
my_list[1]
my_list[-1] # 最後の要素にアクセスする

# リストに要素を追加する
my_list.append(5)

# リストの末尾から要素を削除する
my_list.pop()

# タプルの生成 要素数を変更できない
my_tuple = (1, 2, 3, 4)

# 辞書の生成
my_dict = {"first": 1, "second": 2, "third": 3}

# 辞書の要素へアクセスするにはキーを使う
my_dict["first"]


# 集合の生成 どの種類から成るかだけを保持
my_set = {1, 2, 3, 4, 3, 2, 4, 1}

Tips: リストでやりがちなミス

 リストでは複数の要素を取り扱う事ができますが、意外とミスしやすいのがリストに対する演算です。例えば、次のプログラムを見てください。

my_list = [1, 2, 3, 4]

# 全ての要素に +1をしたい
my_list += 1

 このプログラムではリストの全ての要素に+1をしたいという気持ちで書いています。しかし、このプログラムを実行するとどうなるでしょうか?

実行結果

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

 残念ですが、リストにはこういう演算をすることはできません。このように配列の各要素に同じ演算をすることをベクトル演算と言います(難しい言葉で、SIMD(Single Instruction Multiple Data)とも言います。)。リストにはこのベクトル演算の機能はついていませんが、実はNumpyというライブラリを使って、Numpyのarrayではこの計算をする事ができます。Numpyについては今後、学んでいくことになりますので楽しみにしておいてください。

The following two tabs change content below.
メーカーR&D職 研究開発業務にPythonを使用。 Udemy講師およびKindleで電子書籍を出版。 Udemyでは受講生 約15,000名 Pythonの適用範囲: データ分析、画像処理、統計解析、並列計算、流体解析、深層学習

ABOUT US

メーカーR&D職 研究開発業務にPythonを使用。 Udemy講師およびKindleで電子書籍を出版。 Udemyでは受講生 約15,000名 Pythonの適用範囲: データ分析、画像処理、統計解析、並列計算、流体解析、深層学習