Help us understand the problem. What is going on with this article?

Python3系の基礎文法(リスト、タプル)

More than 3 years have passed since last update.

概要

O'Reilly Japan の「入門 Python 3」及び、下記のPython日本語訳のドキュメントを参考に、
Python3系の基礎文法を勉強します。
同じようにPythonを勉強したいと思ってる方の参考になれば幸いです。

Python 3.6.1 ドキュメント
https://docs.python.jp/3/index.html

シーケンス型

シーケンス型とは、0個以上の要素を扱うためのデータ構造。
基本的なシーケンス型は、list, tuple, range 等がそれに該当する。

リスト型 (list)

リストは、ミュータブルなシーケンスで、順序と内容が変わる場合がある場合に向いている。
また、リスト内では同じ値が複数登場しても良い。
(一意な値を管理できれば順番はどうでも良いという場合、集合を使った方が良いかもしれない)

[]またはlist()による作成

>>> # 空配列の作成 []
>>> empty_list1 = []
>>> empty_list1
[]

>>> # リスト作成 []
>>> str_list1 = ['A','B','C']
>>> str_list1
['A', 'B', 'C']

>>> # 空配列の作成 list()
>>> empty_list2 = list()
>>> empty_list2
[]

>>> # リスト作成 list()
>>> str_list2 = list(['A','B','C'])
>>> str_list2
['A', 'B', 'C']

他のデータ型からリスト型への変換

>>> # 文字列をリストに変換
>>> list('ABC')
['A', 'B', 'C']

>>> # タプルをリストに変換
>>> tuple_sample = ('A','B','C')
>>> list(tuple_sample)
['A', 'B', 'C']

>>> # splitの分割結果をリストに変換
>>> today = '2017/07/01'
>>> today.split('/')
['2017', '07', '01']

>>> # splitの分割結果をリストに変換(空文字要素が含まれる場合)
>>> target = 'A//B/C/DE///F'
>>> target.split('/')
['A', '', 'B', 'C', 'DE', '', '', 'F']
>>> target.split('//')
['A', 'B/C/DE', '/F']

[offset]を指定した要素の取り出し

>>> target = ['A','B','C']

>>> # 正のインデックスを指定
>>> target[0]
'A'
>>> target[1]
'B'
>>> target[2]
'C'

>>> # 負のインデックスを指定(末尾から逆順に数えていく)
>>> target[-1]
'C'
>>> target[-2]
'B'
>>> target[-3]
'A'

>>> # 範囲外のオフセットが指定された場合はエラー
>>> target[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

リストのリスト

リスト型は、まちまちの型の要素(他のリスト型も含む)を格納することが可能。

>>> str_upper = ['A','B','C']
>>> str_lower = ['a','b','c']
>>> str_number = [1 ,'2','3',4]
>>> all_str = [str_upper, str_lower, str_number]

>>> # リストのリスト
>>> all_str
[['A', 'B', 'C'], ['a', 'b', 'c'], [1, '2', '3', 4]]

>>> # リストのリストから第1の要素
>>> all_str[0]
['A', 'B', 'C']

>>> # リストのリストから第2の要素
>>> all_str[1]
['a', 'b', 'c']

>>> # リストのリストから第3の要素
>>> all_str[2]
[1, '2', '3', 4]

>>> # 2個インデックスを指定すると、内臓リストの要素のみ返却される
>>> all_str[1][0]
'a'

[offset]を指定した要素の書き換え

リストはミュータブルなので、オフセットを指定することで値を書き換えることもできる。

>>> target = ['A','B','C']
>>> target
['A', 'B', 'C']

>>> target[1] = 'V'
>>> target
['A', 'V', 'C']

>>> # リストへの要素追加はappend()により行う
>>> target[3] = 'D'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

[offset]の範囲を指定したスライスによる取り出し

>>> target = ['A','B','C']
>>> target
['A', 'B', 'C']

>>> # 先頭から
>>> target[0:]
['A', 'B', 'C']

>>> # 先頭から2文字
>>> target[0:2]
['A', 'B']

>>> # リストの要素を逆順にする
>>> target[::-1]
['C', 'B', 'A']

append()による末尾への要素追加

>>> target = ['A','B','C']
>>> target.append('D')
>>> target
['A', 'B', 'C', 'D']

insert()による要素の追加

append()関数は末尾への要素追加となるため、オフセットを指定して追加位置を指定して、要素を追加したい場合はこちらを使う。
また、末尾を超えるオフセットが指定された場合、リストの末尾に追加される。
(誤ったオフセットに対して例外をは投げられない)

>>> target = ['A','B','C']

>>> # 3文字目に追加
>>> target.insert(2,'Q')
>>> target
['A', 'B', 'Q', 'C']

>>> # 末尾を超えるオフセットを指定した場合
>>> target.insert(10,'Z')
>>> target
['A', 'B', 'Q', 'C', 'Z']

>>> # 末尾から数える場合
>>> target.insert(-2,'V')
>>> target
['A', 'B', 'Q', 'V', 'C', 'Z']

delによる要素の削除

delはPythonの文であり、リストのメソッドではないため、del()とは書かない。

>>> target = ['A','B','C','D','E']

>>> # 3文字目を削除
>>> del target[2]
>>> target
['A', 'B', 'D', 'E']

>>> # 末尾を削除
>>> del target[-1]
>>> target
['A', 'B', 'D']

remove()による要素の削除

オフセット指定ではなく、要素を指定して削除する場合は、delではなくこちらを使う。

>>> target = ['A','B','C','D','E']
>>> target.remove('B')
>>> target
['A', 'C', 'D', 'E']

pop()による要素の取り出しと削除

pop()を使うとリストから要素を取り出し、同時にリストから要素の削除が可能。
引数を指定しない場合、オフセットとして-1(末尾)が指定される。

>>> target = ['A','B','C','D','E','F','G']
>>> # 3文字目をpop
>>> target.pop(2)
'C'
>>> target
['A', 'B', 'D', 'E', 'F', 'G']

>>> # 末尾文字をpop
>>> target.pop()
'G'
>>> target
['A', 'B', 'D', 'E', 'F']

>>> # 先頭文字をpop
>>> target.pop(0)
'A'
>>> target
['B', 'D', 'E', 'F']

extend()または+=を使ったリストの結合

>>> # extend()によるリストの結合
>>> target1 = ['A','B','C']
>>> target2 = ['D','E']
>>> target1.extend(target2)
>>> target1
['A', 'B', 'C', 'D', 'E']

>>> # += によるリストの結合
>>> target1 = ['A','B','C']
>>> target2 = ['D','E']
>>> target1 += target2
>>> target1
['A', 'B', 'C', 'D', 'E']

index()による要素のオフセット確認

>>> target = ['A','B','C','D','E','F','G']
>>> target.index('D')
3

in()を使った値の有無判定

>>> target = ['A','B','C','D','E','F','G']
>>> 'A' in target
True
>>> 'Z' in target
False

count()を使った値の個数計算

>>> target = ['A','A','A','B','B','C']
>>> target.count('A')
3
>>> target.count('B')
2
>>> target.count('C')
1

join()による文字列への変換

join()は文字列メソッドであり、リストメソッドではない。

>>> target = ['A','B','C','D','E','F','G']
>>> ','.join(target)
'A,B,C,D,E,F,G'

len()による要素数の取得

>>> target = ['A','B','C','D','E','F','G']
>>> len(target)
7

sort()による要素のソート(汎用関数を使用する場合も補足)

>>> # 汎用関数 sorted() による昇順ソート
>>> target = ['C','E','A','D','B','F']
>>> sorted_target = sorted(target)
>>> sorted_target
['A', 'B', 'C', 'D', 'E', 'F']

>>> # 汎用関数 sorted() による降順ソート
>>> target = ['C','E','A','D','B','F']
>>> sorted_target = sorted(target, reverse=True)
>>> sorted_target
['F', 'E', 'D', 'C', 'B', 'A']

>>> # リスト関数 sort() による昇順ソート
>>> target = ['C','E','A','D','B','F']
>>> target.sort()
>>> target
['A', 'B', 'C', 'D', 'E', 'F']

>>> # リスト関数 sort() による降順ソート
>>> target = ['C','E','A','D','B','F']
>>> target.sort(reverse=True)
>>> target
['F', 'E', 'D', 'C', 'B', 'A']

copy()によるリストのコピー(それ以外のコピー方法も補足)

>>> target = ['A','B','C']

>>> # リストのcopy()関数によりコピー
>>> target1 = target.copy()
>>> target1
['A', 'B', 'C']

>>> # list()変換関数によりコピー
>>> target2 = list(target)
>>> target2
['A', 'B', 'C']

>>> # リストスライスによりコピー
>>> target3 = target[:]
>>> target3
['A', 'B', 'C']

タプル型(tuple)

タプルはリストとは異なり、イミュータブルなシーケンスであるため、タプルを定義した後に要素の追加や削除、変更といった操作はできない。
また、append()やinsert()などの関数はないため、リストと比べて関数が少ない。

使い分けの仕方としては、定数リストを扱う場合はタプルを使用する。
それ以外の検討ポイントは下記。

  • タプルは消費スペースが少ない。
  • タプルの要素は書き換えられる危険性がない。
  • タプルは辞書のキーとして使える。
  • 名前付きタプルは、オブジェクトの単純な代替品として使える。
  • 関数の引数は、タプルとして渡される。

タプルの作成

>>> # 空タプルの作成
>>> empty_tuple = ()
>>> empty_tuple
()

>>> # 要素が1つのタプル(末尾にカンマをつける)
>>> target1 = 'A',
>>> target1
('A',)

>>> # 要素が複数のタプル(末尾のカンマは省略可能)
>>> target2 = 'A','B','C'
>>> target2
('A', 'B', 'C')

>>> # カッコをつけてもエラーにならないため、こちらの方がタプルだとわかりやすい
>>> target3 = ('A','B','C')
>>> target3
('A', 'B', 'C')

tuple()によるタプルへの変換

>>> str_list = ['A','B','C']
>>> tuple(str_list)
('A', 'B', 'C')

その他

シーケンスアンパック

>>> # リストのアンパック代入
>>> str_list = ['A','B','C']
>>> s1, s2, s3 = str_list
>>> s1
'A'
>>> s2
'B'
>>> s3
'C'

>>> # タプルのアンパック代入
>>> str_tuple = ('A','B','C')
>>> s1, s2, s3 = str_tuple
>>> s1
'A'
>>> s2
'B'
>>> s3
'C'
Amtkxa
ソフトウェアエンジニアです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした