
このレクチャーでは、データ構造の型変換を学習します。
Table of Contents(目次)
データ構造の型変換とは — 目的とメリット
コードを書いていると、他のデータ構造にデータを変換したい場面が出てきます。
例えば、tupleは要素を編集できないという特徴があるため、編集するにはlistへ変換する必要があります。
また、listの重複した要素を排除したいときは、次のコードの2行目のように簡潔に書くことができます。これは、setは重複した値を持たないという特性を活かしています。(ただし、setに変換した時点で並び順は保証されなくなるので注意してください。)
duplicate_list = [5, 4, 2, 3, 1, 2, 4, 5]
unique_list = list(set(duplicate_list))
print(unique_list) # [1, 2, 3, 4, 5] (* 順序は保証されない)
上記コードのような、重複を排除するコードをsetを使わずに行おうとすると、コードを書くのも大変ですし、Pythonの処理時間も大幅にかかってしまいます。しかし、setは重複を排除する処理が高速ですし、何より1行で簡潔にコードを書けることが最大のメリットになります。
他のデータ構造へ変換したいケースは、次のようなものが挙げられます。
- データの扱いがしやすくなる
- setは要素の順序が保証されないため、listやtupleへ変換してインデックス管理を行う
- データ構造を変換することでコードの記述が楽になる
- そのデータ構造のメソッドを使うことでコードの行数が少なくなる、など
- コードが簡潔で分かりやすくなる
- listの重複する要素を
list(set(duplicate_list))
で取り除く
- listの重複する要素を
- 要素を編集したいtupleをlistに変換する
- 要素の変更を行いたくないlistのデータをtupleに変換する
- 間違って要素を変更するコードを書いてしまっても、処理中にエラーになる
1. Pythonでのシーケンス型の相互変換方法
1-1. listとtupleの変換(可変 ⇔ 不変)
tupleへの変換はtuple()
関数を使用します。listへの変換はlist()
関数を使用します。
使いどころ:
- 変更不可にしたい場合 →
tuple()
- 変更可能にしたい場合 →
list()
l1 = [1, 2, 3]
t1 = tuple(l1) # (1, 2, 3)
t2 = (4, 5, 6)
l2 = list(t2) # [4, 5, 6]
1-2. list・tupleからsetへの変換(重複排除・集合化)
listやtupleからsetへ変換する時は、set()
関数を使用します。setに変換した時点で要素の順序は保証されないことに注意してください。
使いどころ:
- 重複を取り除く
- 集合演算(和・積・差)を行う
l = [1, 2, 2, 3]
s1 = set(l) # {1, 2, 3}
t = (3, 3, 4)
s2 = set(t) # {3, 4}
1-3. setからlist・tupleへの変換(順序付きに戻す)
setからlist / tupleに変換することで、順序付きのシーケンスとして処理を行うことができるようになります。ただし、変換した直後の要素の順序は保証されないことに注意してください。
使いどころ:
- 集合から順序付きのシーケンスに変換
- インデックス操作を行う場合
s = {1, 3, 2}
l = list(s) # [1, 2, 3] # 順序は保証されない
t = tuple(s) # (1, 2, 3) # 順序は保証されない
2. Pythonでの文字列と他のデータ型の変換方法
2-1. 文字列(str)からlist・tuple・setへの変換
strをlist / tuple / setへ変換することができます。この場合、文字列から1文字ずつ取り出され、要素として追加されます。setへ変換した場合は、重複した文字は取り除かれ、順序も保持されないので注意してください。
また、strのsplit()
メソッドを使用すると、文字列を区切り文字で分割したlistを得ることができます。下記コード例のように、'Nico,Tom,Emma'
という文字列を区切り文字(','
)を指定してsplit()
メソッドを実行すると、カンマで分割された各単語のlistが返されます。
使いどころ:
- 文字ごとの処理
- 区切り文字で分割してリスト化
s = 'hello'
chars_list = list(s) # ['h', 'e', 'l', 'l', 'o']
chars_tuple = tuple(s) # ('h', 'e', 'l', 'l', 'o')
chars_set = set(s) # {'e', 'h', 'o', 'l'}
text = 'Nico,Tom,Emma'
parts = text.split(',') # ['Nico', 'Tom', 'Emma']
2-2. list・tuple・setから文字列(str)への変換
list / tuple / setからstrへの変換は、文字列のstr.join()
メソッドを使用します。
join()
メソッドは、各要素の間に挿入する文字(区切り文字)に続けて記述します。各要素の間に挿入する区切り文字を','
とした場合、','.join(seq)
のように記述します。区切り文字を空文字(''
)とした場合は単純に各要素の文字列が順番に並びます。
注意としては、結合する各要素は文字列ではないといけません。formatのように自動的に文字に変換するような機能はなく、数字などの値が要素に混じっているとエラーになります。そのため、事前に要素を文字列に変換しておくなど、全ての要素が文字列であることを確実にしておく必要があります。
使いどころ:
- リストや集合の要素を文字列としてまとめたいとき
- CSVやログ出力など
chars = ['a', 'b', 'c']
s1 = ''.join(chars) # 'abc'
s2 = ','.join(chars) # 'a,b,c'
t = ('x', 'y', 'z')
s3 = ' & '.join(t) # 'x & y & z'
s4 = ''.join({'a', 'b', 'c'}) # 'cba' # 集合は順序が不定
s5 = ''.join(sorted({'a', 'b', 'c'})) # 'abc' # sortedで整列する
3. Pythonでのdictと他のデータ型の変換方法
3-1. dictからlist・tuple・setへの変換
dictからlist/ tuple/ setに変換することができます。
keyを取り出したい時はlist(d)
のようにdictを引数にそのまま渡します。
valueを取り出したい時はlist(d.values())
のように記述します。
dictのデータは、keyは重複がありませんが、valueに値の重複が存在する可能性があります。setに変換すると(set(d.values())
)、重複のないvalueのデータを得ることができます。
list(d.items())
のようにd.items()
の情報を変換すると、(key, value)
の要素を持ったデータ([('a', 1), ('b', 2), ('c', 1)]
)を得ることができます。
使いどころ:
- keyやvalueを取り出してシーケンス操作をしたい場合
- 重複なしのvalueを得たい場合
d = {'a': 1, 'b': 2, 'c': 1}
keys_list = list(d) # ['a', 'b', 'c']
values_list = set(d.values()) # {1, 2}
items_list = list(d.items()) # [('a', 1), ('b', 2), ('c', 1)]
3-2. (key, value)リストからdictへの変換
[('key1', 'value1'), ('key2', 'value2')]
の形のlistやtupleからdictを作成できます。dictに変換するにはdict()
関数を使用します。
使いどころ:
- データベースやCSVなどのペア情報からdict作成
pairs = [('a', 1), ('b', 2)]
d = dict(pairs) # {'a': 1, 'b': 2}