1. ホーム 
  2. 備忘録 
  3. Python

リスト型

リストについて

Python には 複数の要素をまとめて取り扱う型としてリスト型が存在する

リストの基本的な取扱い方について以下に記載する


### 基本操作
l = [1, 20, 4, 16, 32, 4]
# リストのインデックス操作
print(l[0])     # 1
print(l[1])     # 20
print(l[-1])    # 4
print(l[-2])    # 32
print(l[0:2])   # [1, 20]
print(l[:3])    # [1, 20, 4]

# リストの長さ(要素数)を取得
print(len(l))   # 6

# 文字列をリストにする
l = list('abcdefg')
print(l)    # ['a', 'b', 'c', 'd', 'e', 'f', 'g']

### 既に存在するリストから一部抜き出してリストを作る
n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 2個とばしのリストを作る
print(n[::2])   # [1, 3, 5, 7, 9]
print(n[1::2])  # [2, 4, 6, 8, 10]

# 逆順(-1個とばし)のリストを作る
print(n[::-1])  # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
print(n[3::-1]) # [4, 3, 2, 1]

### リストのネスト
a = [100, 99, 98]
b = [1, 2, 3]
x = [a, b]
# ネストした要素の取り出し
print(x)    # [[100, 99, 98], [1, 2, 3]]
print(x[0][1])  # 99
print(x[1][2])  # 3

リストの操作

続いて、リストの中身を操作する方法について以下に記載する


l = list('abcdefg')

### 要素の代入
# 文字列と異なり、リスト型は要素単位で代入できる
l[0] = 'X'
print(l)    # ['X', 'b', 'c', 'd', 'e', 'f', 'g']

# スライスして代入もできる
l[2:5] = ['C', 'D', 'E']
print(l)    # ['X', 'b', 'C', 'D', 'E', 'f', 'g']

# スライスして要素の削除もできる
l[2:5] = []
print(l)    # ['X', 'b', 'f', 'g']

# 空の状態を代入して中身を全部消す
l[:] = []
print(l)    # []


### 要素の追加や削除
n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 最後に追加
n.append(100)
print(n)    # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]

# 指定した箇所に追加
n.insert(1, 200)
print(n)    # [1, 200, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]

# 指定した箇所の要素を取り出す
#  ※指定なしの場合は最後の要素
print(n.pop())  # 100
print(n)        # [1, 200, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(n.pop(1)) # 200
print(n)        # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 削除
del n[0]
print(n)    # [2, 3, 4, 5, 6, 7, 8, 9, 10]
# リスト自体を削除(定義が消える)
del n
# 定義が削除されるため、以下はエラーとなる
# print(n)    # NameError: name 'n' is not defined

# 要素の除外
n = [1, 2, 2, 2, 3]
n.remove(2)
print(n)    # [1, 2, 2, 3]
# 除外すべき要素がない場合はエラー
n.remove(4) # ValueError: list.remove(x): x not in list

リストの連結

リスト同士を連結する方法について以下に記載する


### リストの連結
a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]

# +演算子で連結する
#   新しいリストを代入する形になるため、idが書き変わる
print(id(a))    # 2358444696128
a = a + b
print(a)    # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(id(a))    # 2358452465600

# +=演算子で連結する
#   元のリストを拡張する形になるため、idが書き変わらない
a = [1, 2, 3, 4, 5]
print(id(a))    # 2109383300864
a += b
print(a)    # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(id(a))    # 2109383300864

# extend メソッドで連結する
#   元のリストを拡張する形になるため、idが書き変わらない
a = [1, 2, 3, 4, 5]
print(id(a))    # 2109380477440
a.extend(b)
print(a)    # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(id(a))    # 2109380477440

リストのメソッド

リスト型には様々なメソッドが用意されている

以下にメソッドの一部を記載する


### リストのメソッド
l = [1, 2, 3, 4, 5, 1, 2, 3]

# 指定した要素がリスト内のどこにあるか返すメソッド
#  第二引数で検索開始位置を指定できる
print(l.index(3))       # 2
print(l.index(3, 3))    # 7

# 指定した要素がリスト内にいくつ含まれているか返すメソッド
print(l.count(3))       # 2

# 指定した要素がリスト内に含まれていればTrue
if 5 in l:
    print('exist')      # exist

# 要素を昇順に並べる
l.sort()
print(l)    # [1, 1, 2, 2, 3, 3, 4, 5]
# 要素を降順に並べる
l.sort(reverse=True)
print(l)    # [5, 4, 3, 3, 2, 2, 1, 1]
# 要素の並びを反転させる
l.reverse()
print(l)    # [1, 1, 2, 2, 3, 3, 4, 5]

s = 'My name is Mike.'
# 指定した文字列で分割する
to_split = s.split(' ')
print(to_split)     # ['My', 'name', 'is', 'Mike.']
# 指定した文字列でリストの要素を連結した文字列を返す
x = '_'.join(to_split)
print(x)    # My_name_is_Mike.

# 他にも色々なメソッドを知りたければヘルプを活用すること
print(help(list))

リストのコピー

リストをコピーする際は参照渡しやシャローコピー、ディープコピーの差に気を付けること

以下に各コピーの差について記載する


import copy

### 各コピーの違い
l = [1, 2, [-3, -4]]

l_assign = l                # 代入(参照渡し)
l_slice = l[:]              # スライスしたリストの代入
l_shallow = l.copy()        # シャローコピー
l_deep = copy.deepcopy(l)   # ディープコピー

l[1] = 100
l[2][0] = 200

print(l)            # [1, 100, [200, -4]]
print(l_assign)     # [1, 100, [200, -4]]
print(l_slice)      # [1, 2, [200, -4]]
print(l_shallow)    # [1, 2, [200, -4]]
print(l_deep)       # [1, 2, [-3, -4]]

上記の通り、コピーの差によっては元のリストの中身を書き換えた際にコピー先にも影響がでることに留意する

また、スライスしたリストの代入はシャローコピーと同等であり、ディープコピーではないことに気を付けること