【Python】 Python ~ 基本編 / リスト ~

■ はじめに

配列/リスト系のことを学ぶ

目次

【1】リスト / 配列 (List)の定義
【2】要素数を調べる
【3】要素の追加
 1)append()
 2)extend()
 3)append() / extend() の違い
【4】要素の挿入
【5】要素の削除
 1)clear() ... リストを空にする
 2)remove() ... 値の削除
 3)pop() ... インデックスによる削除
 4)del ... リスト・オブジェクトの破棄
【6】ループ
 1)リストからループ
 2)enumerate()
 3)zip()
 補足:アンパック

※ その他の事項は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2020/11/01/000000

 【1】リスト / 配列 (List)の定義

* [ ... ]を使う

サンプル

fruits = ["apple","grape","banana"]
print(fruits[0]) # "apple"が表示

 【2】要素数を調べる

* len() を使う

サンプル

name_list = ['Tom', 'Sam', 'Mike', 'Sam', 'Kevin', 'Sam', 'Mike', 'Sam',]

# len(【リスト】)
print(len(name_list)) # 8

 【3】要素の追加

1)append()

* append() : 要素の追加

サンプル

list1 = [{'id': '0001', 'name': 'Mike'}, {'id': '0002', 'name': 'Sam'}]
list2 = [{'id': '0003', 'name': 'Ken'}, {'id': '0004', 'name': 'Kevin'}]

list1.append(list2)
print('list1*****************')
# [{'id': '0001', 'name': 'Mike'}, {'id': '0002', 'name': 'Sam'},
# [{'id': '0003', 'name': 'Ken'}, {'id': '0004', 'name': 'Kevin'}]]
print(list1)

print('list1*****************')
list1.append({'id': '0005', 'name': 'Tim'})
# [{'id': '0001', 'name': 'Mike'}, {'id': '0002', 'name': 'Sam'},
# [{'id': '0003', 'name': 'Ken'}, {'id': '0004', 'name': 'Kevin'}],
# {'id': '0005', 'name': 'Tim'}]
print(list1)

2)extend()

* extend() : 要素の追加

サンプル

list1 = [{'id': '0001', 'name': 'Mike'}, {'id': '0002', 'name': 'Sam'}]
list2 = [{'id': '0003', 'name': 'Ken'}, {'id': '0004', 'name': 'Kevin'}]

list1.extend(list2)
print('list1*****************')
# [{'id': '0001', 'name': 'Mike'}, {'id': '0002', 'name': 'Sam'},
# {'id': '0003', 'name': 'Ken'}, {'id': '0004', 'name': 'Kevin'}]
print(list1)

print('list1*****************')
list1.extend({'id': '0005', 'name': 'Tim'})
# [{'id': '0001', 'name': 'Mike'}, {'id': '0002', 'name': 'Sam'},
# {'id': '0003', 'name': 'Ken'}, {'id': '0004', 'name': 'Kevin'},
# 'id', 'name'] <= ★意図しない追加★
print(list1)

3)append() / extend() の違い

* append()にしなければならないところを
 extend()にしてバグったので、自戒の意味を込めてメモ。

サンプル

# append() の場合
list1 = ['hello', 'world']
list2 = ['Mike', '!!']
list1.append(list2)
print(list1)
# ['hello', 'world', ['Mike', '!!']]

# extend の場合
list1 = ['hello', 'world']
list2 = ['Mike', '!!']
list1.extend(list2)
print(list1)
# ['hello', 'world', 'Mike', '!!']

 【4】要素の挿入

サンプル

# 要素の挿入 : insert(【インデックス】, 【値】)
fruits.insert(2, "water melon")

# 実験
list = []
list.insert(0, "aa")
list.insert(0, "bb")
list.insert(0, "cc")
for i, value in enumerate(list):
  print("index = {INDEX}, value={VALUE}".format(
    INDEX=i, VALUE=value))

# [表示結果]
# index = 0, value=cc
# index = 1, value=bb
# index = 2, value=aa

 【5】要素の削除

1)clear() : すべての要素を削除
2)remove() : 指定した値と同じ要素を削除
3)pop() : 指定した位置の要素を削除し、値を取得
4)del : すべての要素を削除

1)clear() ... リストを空にする

サンプル

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

a.clear()
print(a) # []

2)remove() ... 値を指定した削除

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a.remove(2)
print(a) # [1, 3, 4, 5, 6, 7, 8, 9]

name_list1 = ['Tom', 'Sam', 'Mike', 'Kevin']
name_list1.remove("Sam")
print(name_list1) # ['Tom', 'Mike', 'Kevin']

# 複数含まれる場合は、最初の一つだけが削除
name_list2 = ['Tom', 'Sam', 'Mike', 'Sam', 'Kevin', 'Sam', 'Mike', 'Sam',]
name_list2.remove("Sam")
print(name_list2) # ['Tom', 'Mike', 'Sam', 'Kevin', 'Sam', 'Mike', 'Sam']

# 値がないリストを削除した場合は例外
name_list3 = ['Tom', 'Sam', 'Mike', 'Kevin']
name_list3.remove("dummy")
print(name_list3) # ValueError: list.remove(x): x not in list

3)pop() ... インデックスによる削除

* 感覚的に、リストから指定したインデックスの値を取り出す
 => 取り出した結果、リストから値が削除される形になる

サンプル

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(a.pop(0)) # 0
print(a) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(a.pop(7)) # 8
print(a) # [1, 2, 3, 4, 5, 6, 7, 9]

4)del ... リスト・オブジェクトの破棄

サンプル

# 要素の削除 : del ... ★削除する文法のクセが強い★
del fruits[0]

 【6】ループ

1)リストからループ
2)enumerate() : index と共にループできる
3)zip() : リストをまとめる

1)リストからループ

list_1 = ['x', 'y', 'z']
for val in list_1:
  print(val)
# x
# y
# z

fruits = ["apple","grape","banana"]
for fruit in fruits:
    print(fruit)

補足:リスト内でのループ(リスト内砲表記)

values = [i for i in range(10)]

# リスト内砲表記については、以下の関連記事を参照のこと。

Python ~ 基本編 / リスト・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/11/01/000000

2)enumerate()

サンプル

list = []
list.insert(0, "aa")
list.insert(0, "bb")
list.insert(0, "cc")
for i, value in enumerate(list):
  print("index = {INDEX}, value={VALUE}".format(
    INDEX=i, VALUE=value))

# [表示結果]
# index = 0, value=cc
# index = 1, value=bb
# index = 2, value=aa

numbers = [1,2,3,4,5]
for (i, number) in enumerate(numbers):
    print(str(i) + " : " + str(number))

3)zip()

サンプル

list_1 = ['x', 'y', 'z']
list_2 = [1, 2, 3]

ziped_list = list(zip(list_1, list_2))
print(ziped_list)
# 出力結果 (要素が組み合わせれ、タプルで返される)
# [('x', 1), ('y', 2), ('z', 3)]

for key, value in ziped_list:
  print('key {}, value = {}'.format(key, value))
# 出力結果
# key x, value = 1
# key y, value = 2
# key z, value = 3

# 引数に(*)をつけると、unzip(zipの逆で分解)
unzip1, unzip2 = zip(*ziped_list)
print(unzip1)
print(unzip2)
# 出力結果
# ('x', 'y', 'z')
# (1, 2, 3)

補足:アンパック

* リスト、タプル、辞書などのコレクションを展開し、
 複数の変数に代入できる

list_ex1 = [1, 2, 3]
a, b, c = list_ex1 # ★アンパック
print(f"{a} / {b} / {c}") # 1 / 2 / 3

# ★これもアンパックの例
for (i, number) in enumerate(numbers):

参考文献

http://www.tohoho-web.com/python/list.html
https://qiita.com/taro-ari/items/9f54536fe3c623813db1

関連記事

Python ~ 基本編 / リスト・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/11/01/000000
Python ~ 基本編 / 辞書 ~
https://dk521123.hatenablog.com/entry/2019/10/27/100014
Python ~ 基本編 / 辞書・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/10/11/000000
Python ~ 基本編 / タプル ~
https://dk521123.hatenablog.com/entry/2019/10/26/000000
Python ~ 基本編 / 集合 Set ~
https://dk521123.hatenablog.com/entry/2021/04/02/000000
Python ~ 基本編 / ラムダ lambda ~
https://dk521123.hatenablog.com/entry/2019/09/23/000000
Python ~ 基本編 / map ~
https://dk521123.hatenablog.com/entry/2021/03/29/000000
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251