list() / tuple() / set()
| 対応: | Python 2(2000) |
|---|
リスト・タプル・セットを相互に変換する組み込み関数です。それぞれのデータ型の特性を活かして使い分けます。
構文
# イテラブルをリストに変換する list(イテラブル) # イテラブルをタプル(変更不可のリスト)に変換する tuple(イテラブル) # イテラブルをセット(重複なし・順序なし)に変換する set(イテラブル) # イテラブルを変更不可のセットに変換する frozenset(イテラブル)
関数一覧
| 関数 | 概要 |
|---|---|
| list(iterable) | イテラブルをリストに変換します。引数なしで空リストを作成します。 |
| tuple(iterable) | イテラブルをタプルに変換します。タプルは変更不可(イミュータブル)です。 |
| set(iterable) | イテラブルをセットに変換します。重複は自動で除去され、順序は保証されません。 |
| frozenset(iterable) | 変更不可のセットを作成します。辞書のキーやセットの要素として使えます。 |
サンプルコード
list_tuple_set_1.py
# list() で様々なオブジェクトをリストに変換する
print(list(range(5)))
print(list("python"))
print(list((1, 2, 3)))
print(list({1, 2, 3}))
# 呪術師の名前リストを作る
sorcerers = ("五条悟", "虎杖悠仁", "伏黒恵", "釘崎野薔薇", "七海建人")
sorcerer_list = list(sorcerers)
print(sorcerer_list)
print(type(sorcerer_list))
実行すると次のように出力されます。
python3 list_tuple_set_1.py [0, 1, 2, 3, 4] ['p', 'y', 't', 'h', 'o', 'n'] [1, 2, 3] [1, 2, 3] ['五条悟', '虎杖悠仁', '伏黒恵', '釘崎野薔薇', '七海建人'] <class 'list'>
list_tuple_set_2.py
# tuple() でリストをタプルに変換する
# タプルは変更不可なので定数的なデータに向いている
grades = [1, 2, 3, 4, 5]
t = tuple(grades)
print(t)
print(type(t))
# タプルは辞書のキーとして使える(リストは使えない)
locations = {
(35.68, 139.76): "東京",
(34.69, 135.50): "大阪",
}
print(locations[(35.68, 139.76)])
# 呪術師の属性をタプルで固定する
gojo = ("五条悟", "特級呪術師", "無下限呪術")
print(gojo[0], "技: ", gojo[2])
実行すると次のように出力されます。
python3 list_tuple_set_2.py (1, 2, 3, 4, 5) <class 'tuple'> 東京 五条悟 技: 無下限呪術
list_tuple_set_3.py
# set() で重複を取り除く
encountered = ["五条悟", "虎杖悠仁", "五条悟", "伏黒恵", "虎杖悠仁"]
unique = set(encountered)
print(unique)
# セット演算で集合を操作する
grade1 = {"五条悟", "七海建人", "伏黒恵"}
grade2 = {"伏黒恵", "釘崎野薔薇", "虎杖悠仁"}
print(grade1 & grade2)
print(grade1 | grade2)
print(grade1 - grade2)
# frozenset() で変更不可のセットを作る
forbidden = frozenset(["死滅回游", "降霊術"])
access_table = {forbidden: "特級限定"}
print(access_table[forbidden])
実行すると次のように出力されます。
python3 list_tuple_set_3.py
{'五条悟', '虎杖悠仁', '伏黒恵'}
{'伏黒恵'}
{'五条悟', '七海建人', '伏黒恵', '釘崎野薔薇', '虎杖悠仁'}
{'五条悟', '七海建人'}
特級限定
よくあるミス
よくあるミス1: タプルを変更しようとする
タプルはイミュータブルです。要素を変更・追加・削除しようとすると『TypeError』が発生します。変更が必要な場合はリストを使うか、一度リストに変換してから操作します。
mistake1_ng.py
sorcerers = ("五条悟", "虎杖悠仁", "伏黒恵")
sorcerers[0] = "七海建人"
実行すると次のように出力されます。
python3 mistake1_ng.py TypeError: 'tuple' object does not support item assignment
mistake1_ok.py
sorcerers = ("五条悟", "虎杖悠仁", "伏黒恵")
sorcerer_list = list(sorcerers)
sorcerer_list[0] = "七海建人"
sorcerers = tuple(sorcerer_list)
print(sorcerers)
実行すると次のように出力されます。
python3 mistake1_ok.py
('七海建人', '虎杖悠仁', '伏黒恵')
よくあるミス2: set() で順序が変わることを忘れる
セットは順序を保証しません。順序を保ちながら重複を除去したい場合は、Python 3.7以降では辞書の挿入順保持を利用した『list(dict.fromkeys(iterable))』を使います。
mistake2_ng.py
names = ["虎杖悠仁", "五条悟", "虎杖悠仁", "伏黒恵"] deduped = list(set(names)) print(deduped)
実行すると次のように出力されます。
python3 mistake2_ng.py ['伏黒恵', '五条悟', '虎杖悠仁']
mistake2_ok.py
names = ["虎杖悠仁", "五条悟", "虎杖悠仁", "伏黒恵"] deduped = list(dict.fromkeys(names)) print(deduped)
実行すると次のように出力されます。
python3 mistake2_ok.py ['虎杖悠仁', '五条悟', '伏黒恵']
概要
リスト・タプル・セットはそれぞれ用途が異なります。変更する必要がないデータ(座標・RGB値・曜日など)はタプルで持つと変更を防げます。また、タプルはリストより若干メモリ効率が良く、ハッシュ可能なのでデータのキーとして使えます。
セットの最大の用途は重複除去と高速な存在確認です。セットの『in』演算子はリストのO(n)に対してO(1)(平均)で動作します。大量のデータから特定の値を頻繁に検索する場合はリストをセットに変換してから検索すると高速になります。
『set()』に変換すると要素の順序は保持されません。順序を保ちながら重複を除去したい場合は、Python 3.7以降では辞書のキーが挿入順を保持することを利用して『list(dict.fromkeys(iterable))』という手法が使えます。セットを使った辞書の操作については『辞書.keys() / values() / items()』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。