List
List
は、各種データを入れる配列のようなものです。
公式チュートリアルの該当部分はこちら
データ構造はこんな感じ。要素として許されるのは、数字だけじゃなくて、str でも List でもOKです。あとから、要素の追加削除もできます。
[0, 1, 2, 3, 4]
初期化
# 初期化
lst = [0, 1, 2, 3, 4]
print(lst) # 出力: [0, 1, 2, 3, 4 ]
要素アクセス
# index アクセス
print('lst[2]:', lst[2]) # 出力 lst[2]: 2
追加・サイズ・合計値
# 追加
lst.append(5) # 5 を追加
print(lst) # 出力 [0, 1, 2, 3, 4, 5 ]
lst2 = list(range(6, 10)) # 6 から 10 (含まず)の range をリストに
print(lst2) # 出力 [ 6, 7, 8, 9 ]
lst.extend(lst2) # lst に lst2 追加
print(lst) # 出力 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(len(lst), sum(lst)) # サイズと合計値、出力 10 45
index 指定での削除・挿入
# index 削除・挿入
lst.insert(1, 11) # 1番目の要素として 11 を挿入
print(lst) # 出力 [0, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9]
lst.pop(1) # 1番目の要素を削除
print(lst) # 出力 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
要素の検索・削除
# 検索・削除
# 値 8 が lst に含まれるかどうか
print('8 in lst:', 8 in lst) # 出力 8 in lst: True
# 値 8 を検索し index を返す
print('lst.index(8):', lst.index(8)) # 出力 lst.index(8): 8
lst.remove(8) # lst から値 8 の要素を削除
print(lst) # 出力 [0, 1, 2, 3, 4, 5, 6, 7, 9]
# 1..9 (9含まず) の範囲で 値 6 を検索
print('lst.index(6, 1, 9):', lst.index(6, 1, 9)) # 出力 lst.index(6, 1, 9): 6
slice(部分リスト)
# slice (部分リスト)
print('lst[3:6]:', lst[3:6]) # 出力 lst[3:6]: [3, 4, 5]
print('[lst[:3]:', lst[:3]) # 出力 [lst[:3]: [0, 1, 2]
print('lst[6:]:', lst[6:]) # 出力 lst[6:]: [6, 7, 9]
print('lst[0:8:2]:', lst[0:8:2]) # 出力 lst[0:10:2]: [0, 2, 4, 6]
list に対する順次アクセス
# list に対する順次アクセス、 for ループ3パターン
lst = lst[:4] # [0, 1, 2, 3] に
i = 0
for elem in lst:
print(f'A: {i} 番目: {elem}')
i += 1
for i in range(len(lst)):
print(f'B: {i} 番目: {lst[i]}')
for i, elem in enumerate(lst):
print(f'C: {i} 番目: {elem}')
enumerate()
は、list
の各要素に対して、「要素が何番目かという情報」と「要素自身」を組 (tuple) にして、数え上げてくれます(iterator)。
tuple
の list
みたいなものですが、list
として実体化されているわけではありません。tuple
の list
にしたければ、関数list()
で変換できます。
list に順次アクセスし、list 作成
いくつか方法を載せておきます。
# list を順番にアクセスし、 list 作成
result = [] # 最初は普通のループ
for elem in lst:
result.append(elem * elem)
print(result)
result2 = [elem * elem for elem in lst] # 内包表現
print(result2)
result3 = list(map(my_square, lst)) # map 関数
print(result3)
result4 = list(map(lambda n: n * n, lst)) # map + lambda
print(result4) # 出力:
map(func, list)
は、list
の各要素に対して、関数func
を実行した結果を
順次作成してくれる関数です。
ある意味、結果の list
みたいなものを返す関数ですが、
実際に各要素の結果を求めて list
として実体化するわけではありません。そういう手続きを返すだけ。
list
にしたければ関数 list()
で実体化してあげましょう。
あと、lambda
はその場で関数を定義する機能で、lambda n: n*n
は、以下で定義される関数を表します。
def func(n):
return n*n
2 つ(以上)の list を順番にアクセス
# 2 つ(以上)の list を順番にアクセス
lstA = list(range(4)) # [0, 1, 2, 3]
lstB = list(range(0, 12, 3)) # [0, 3, 6, 9]
print(lstA, lstB)
# lstA: [0, 1, 2, 3] と lstB: [0, 3, 6, 9] の要素を
# 順に a, b に割り当ててloop
for a, b in zip(lstA, lstB):
print(f'a: {a}, b: {b}')
# 内包表記も可能
lstAB = [f'a: {a}, b: {b}' for a, b in zip(lstA, lstB)]
print(lstAB) # ['a: 0, b: 0', 'a: 1, b: 3', 'a: 2, b: 6', 'a: 3, b: 9']
list の同一性
二つの list の要素が、並びも含めて一致していれば、同一になります。
a = [1, 2]
b = [2, 2]
print(f'a==b: {a == b} for a: {a} and b: {b}')
# a==b: False for a: [1, 2] and b: [2, 2]
a[0] = 2
print(f'a==b: {a == b} for a: {a} and b: {b}')
# a==b: True for a: [2, 2] and b: [2, 2]
ソート
要素に自然な大小関係がつく場合は、sort()
関数でソートできます。
通常は昇順にソートしますが、オプション引数というので、reverse=True
を指定すると、逆順になります。ソート順を任意に指定することもできますが、まあ、そのあたりはサンプル例でも見てください。
target = [i * (i + 1) * ((-1) ** i) for i in range(6)]
print(target) # [0, -2, 6, -12, 20, -30]
target.sort() # 通常は昇順にソート
print(target) # [-30, -12, -2, 0, 6, 20]
target.sort(reverse=True) # `reverse=True` で降順にソート
print(target) # [20, 6, 0, -2, -12, -30]