python

【python】list(リスト型)

他のプログラミング言語同様、Pythonにも複数の要素(数や文字列)を内包するデータ型があります。その1つがリストと呼ばれるものです。リストは[要素1,要素2 ….,要素N]のように作ります。

リスト型の宣言方法

要素を指定してリストを作成する
l = [2,3,4,7,2]
print(l) #出力:[2, 3, 4, 7, 2]
要素を入力から受け取りリストを作成する
#例)入力:1 2 3 4 5
l = map(int, input().split())
print(l) #出力:[1, 2, 3 ,4, 5]
要素を入力から受け取りリストを作成する
#例)入力:
#1 
#2 
#3 
#4 
#5

l = [int(x) for i in range(5)]
print(l) #出力:[1, 2, 3 ,4, 5]
リストのリストを作成する
#例)入力:
#1 2 3 4 5
#6 7 8 

#要素をしてリストを作成する
l = [[1,2,3,4,5],[6,7,8]]
print(l) #出力: [[1,2,3,4,5],[6,7,8]]

#要素を入力から受け取りリストを作成する
l =[input().split() for i in range(2)]
print(l) #出力:[['1', '2', '3', '4', '5'], ['6', '7', '8']]

l =[map(int, input().split()) for i in range(2)]
print(l) #出力:[<map object at 0x7fa3602a0250>, <map object at 0x7fa3602a02b0>]

l =[list(map(int, input().split())) for i in range(2)]
print(l) #出力:[[1, 2, 3, 4, 5], [6, 7, 8]]

リストの要素を取り出す(インデックス指定+スライス機能)

文字列は添字表記(インデックス表記、つまり、ある文字列の何文字目かを指定)することができます。 最初の文字は 0番目 になります。 添字には負の数を指定するこもでき、その場合は右から数えます。ただし、0と-0は等しいので、負の添字は-1から始まることに注意してください。

スライスとは、リストに入っている要素のうち、連続した複数の要素を指定する記法です

リスト名[指定する範囲の始めのインデックス:指定する範囲の終わりのインデックス+1]

word = 'Python'
print(word[0]) #P
print(word[-1]) #n
print(word[-2]) #o
print(word[0:2]) #Py
print(word[:3]) #Pyt
print(word[3:]) #hon
print(word[4:42]) #on スライスを利用した場合はエラーは発生せず適切に処理されます。
print("length: ", len(word)) #length:  6
word[0] = 'J' #エラー
word = 'J' + word[1:]# 1文字目をJにして、以降はword[1:]を使う

letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
#['a', 'b', 'c', 'd', 'e', 'f', 'g'] 

# 2番目から4番目を書き換える 
letters[2:5] = ['C', 'D', 'E'] 
#['a', 'b', 'C', 'D', 'E', 'f', 'g'] 

# 2番目から4番目を削除する 
letters[2:5] = [] 
#['a', 'b', 'f', 'g'] 

# リストの要素を全て削除する(空リストを作る) 
letters[:] = [] 
#[]

# リストの要素を取り出す(偶数番目の要素)
letters[::2]

リストの連結

squares = [1, 4, 9, 16, 25]
print(squares + [36, 49, 64, 81, 100])
#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

リストの追加

末尾に要素を追加する

リストの変数名の後ろに.append(x) と記述することでリストの末尾に新しい要素 x を追加することができます。

行の末尾に追加する
l = [1, 8, 27, 65, 125] 
add_data = [1, 2, 3]
l.append(6 ** 3) 
l.append(7 ** 3)
print(l) #出力:[1, 8, 27, 27, 125, 216, 343]

l.append(add_data)
print(l) #出力:[1, 8, 27, 65, 125, 216, 343, [1, 2, 3]]

l.append([1,2,3])
print(l) #出力:[1, 8, 27, 65, 125, 216, 343, [1, 2, 3], [1, 2, 3]]
列の末尾に追加する

2次元配列などの多次元配列などには、行だけではく、列にも要素を追加したい時があります。

l = [[1, 2, 3], [4, 5, 6, 7], [9, 10]]
print(l)  # [[1, 2, 3], [4, 5, 6, 7], [9, 10]]

add_data1 = 3
add_data2 = ["a", "i", "u", "e", "o"]
l[1].append(add_data1)
print(l)  # [[1, 2, 3], [4, 5, 6, 7, 3], [9, 10]]

l[0].append(add_data2)
print(l)  # [[1, 2, 3, ['a', 'i', 'u', 'e', 'o']], [4, 5, 6, 7, 3], [9, 10]]

指定したところに要素を追加する

リストの変数名.insert(i, x) はインデックス i 番目に要素 x を追加します。

指定した行に追加する
l = [1, 3, 5, 7]
print(l) #出力:[1, 3, 5, 7]

l.insert(1, 2)  # 1番目に2を追加する
print(l) #出力:[1, 2, 3, 5, 7]

add_data = [1,2,3]
l.insert(1,add_data)
print(l) #出力:[1, [1, 2, 3], 2, 3, 5, 7]

l.insert(1,[5,6]) 
print(l) #出力:[1, [5, 6], [1, 2, 3], 2, 3, 5, 7]
指定した列に追加する
l = [[1, 2, 3], [4, 5, 6, 7], [9, 10]]
print(l)  #出力:[[1, 2, 3], [4, 5, 6, 7], [9, 10]]

add_data1 = 3
add_data2 = ["a", "i", "u", "e", "o"]
l[1].insert(1, add_data1)
print(l)  #出力:[[1, 2, 3], [4, 3, 5, 6, 7], [9, 10]]

l[0].insert(2, add_data2)
print(l)  #出力:[[1, 2, ['a', 'i', 'u', 'e', 'o'], 3], [4, 3, 5, 6, 7], [9, 10]]

末尾にシーケンス(複数の要素)を追加する

リストの変数名.extend(x)はリストの末尾にシーケンスxを追加します

l = [[1, 2, 3], [4, 5, 6, 7], [9, 10]]
add_data = ["a", "i", "u", "e", "o"]

l.extend(add_data)
print(l) #出力:[[1, 2, 3], [4, 5, 6, 7], [9, 10], 'a', 'i', 'u', 'e', 'o']

 

リストの置き換え・削除

文字列と違って、リストは要素の変更が可能

l = [1, 8, 27, 65, 125]  # 3番目の要素を置き換えたい
l[3] = 4 ** 3  # 3番目の要素を4の3乗に置き換える
print(l) #出力:[1, 8, 27, 64, 125]

a = ["AB", "CD", "EF", "GH"]
#リストaの2番目の要素を削除する。削除すると要素数が減る
del a[1]
print(a) #出力:['AB', 'EF', 'GH']

a.clear()
print(a) #出力:[]

a = ["AB", "CD", "EF", "GH"]
a = []
print(a) #出力:[]

・clear() 全ての要素を削除できる

要素を削除する

リストの変数名.remove(x) はリストの中でxと等しい最初の要素を削除します。

lst = [0, 1, 2, 3, 0, 1, 2, 3]
print(lst)

# 最初の2を削除する
lst.remove(2)
print(lst)

# もう一度2を削除する
lst.remove(2)
print(lst)
[0, 1, 2, 3, 0, 1, 2, 3]
[0, 1, 3, 0, 1, 2, 3]
[0, 1, 3, 0, 1, 3]



リストの中に要素が含まれているか確認する

letters = ['a', 'b', 'c', 'd']

print("'a' in letters =", 'a' in letters)
print("'y' in letters =", 'y' in letters)
print("'z' not in letters =", 'z' not in letters)
#'a' in letters = True
#'y' in letters = False
#'z' not in letters = True

リストの変数名.index(x) は、リスト中で値x を持つ最初の要素のインデックスを返します。

lst = [1, 2, 3, 4, 5]
idx = lst.index(4)
print(idx)
3

リストの要素をソートする

昇順にソートする

リストの変数名.sort() はリスト内の要素をソート(昇順に整列)します。

lst = [1, 0, 3, 2]
print(lst) #出力:[1, 0, 3, 2]

lst.sort()
print(lst) #出力:[0, 1, 2, 3]
降順にソートする

降順ソートする場合は.sort(reverse=True) とします。

lst = [1, 0, 3, 2]
print(lst) #出力:[1, 0, 3, 2]

lst.sort(reverse=True)
print(lst) #出力:[3, 2, 1, 0]
逆順にソートする

リストの変数名.reverse() はリスト内の要素を逆順にします。

lst = [1, 3, 2, 4]
print(lst) #出力:[1, 3, 2, 4]

lst.reverse()
print(lst) #出力:[4, 2, 3, 1]
ソート順をカスタマイズする
a = [
    [1, 7, 'z'],
    [3, 2, 'x'],
    [1, 8, 'r'],
    [2, 2, 's'],
    [1, 9, 'b'],
    [2, 2, 'a']
]
print(sorted(a, key=lambda x: x[2]))
#出力:[[2, 2, 'a'], [1, 9, 'b'], [1, 8, 'r'], [2, 2, 's'], [3, 2, 'x'], [1, 7, 'z']]

ここでは、a[i][2]を文字列順でソートしています

今あるリストをコピーして新しいリストを作成する

リストの変数名.copy() を使って今あるリストをコピーします。

lst1 = [0, 1, 2, 3]

lst2 = lst1.copy()  # lst1をコピー
lst3 = lst1

# lst1, lst2は同じ内容[0, 1, 2, 3]リストだが別のリストを保持している。
print('lst1:', lst1) #出力:lst1: [0, 1, 2, 3]
print('lst2:', lst2) #出力:lst2: [0, 1, 2, 3]
print('lst3:', lst3) #出力:lst3: [0, 1, 2, 3] 

# lst2とlst3の最初の要素を-1にする
lst2[0] = -1 
lst3[0] = -1
print('lst1:', lst1) #出力:lst1: [-1, 1, 2, 3]
print('lst2:', lst2) #出力:lst2: [-1, 1, 2, 3]
print('lst3:', lst3) #出力:lst3: [-1, 1, 2, 3]

javaや他の言語でもよくあるミス

lst1 = [0, 1, 2, 3]
lst2 = lst1

lst2[0] = -1
print('lst1:', lst1) #出力:lst1: [-1, 1, 2, 3] 
print('lst2:', lst2) #出力:lst2: [-1, 1, 2, 3]

Pythonの代入文=は基本的にコピーを生成しません。 このため lst1 も lst2 も同一のリスト(同じ id を持つ)になっています。javaでも同じことが起きるよ。javaでは、clone()メソッドを使うよ。詳しくは過去記事をご覧ください

実際に同一のリストなのかは lst1 is lst2 で調べることができます。

print("lst1 is lst2=", lst1 is lst2)
lst1 is lst2= True
全てのクラスがの持っておくべきメソッド多くのインスタンスに共通して行える5つの基本操作 メソッド 操作の内容 関連するクラス toString...

リストの合計値、最大値、最小値、要素数を調べる

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

sum(a) 
#リストの合計 → 55

max(a)
#リストの最大値 → 10

min(a)
#リストの最小値 → 1

len(a)
#リストの要素数 → 10

・sum() →合計値
・max() →最大値
・min() →最小値
・len() →要素数