はじめに
Pythonのリストに関する扱いの自分用メモとしてまとめてみました。AtCoderのPython3.4.3と3.8で動作確認済みです。
宣言と初期化
lst = [] #宣言
lst = [1, 2, 3] #初期化
要素の追加・挿入
appendメソッドは .append(n)
でリストの末尾にnを追加します。
lst.append(4) #lst=[1, 2, 3, 4]
insertメソッドは .insert(n,要素)
でn番目に要素を追加します。
lst.insert(1,4) #lst=[1, 4, 2, 3]
extendメソッドは .extend(lst)
で末尾にリストを連結します。
lst.extend([4, 5]) #lst=[1, 2, 3, 4, 5]
+演算子を使うことでもリストを連結させることが出来ます。
lst = lst + [4, 5, 6] #lst=[1, 2, 3, 4, 5, 6]
#要素の削除
del文は del lst[n]
で対象のオブジェクトを削除します。
del lst[1] #lst=[1, 3]
popメソッドは .pop(n)
でリストの指定された位置の要素を削除します。引数を取らなければ末尾を削除します。
lst.pop(1) #lst=[1, 3]
lst.pop() #lst=[1, 2]
clearメソッドは clear()
でリストの全要素を削除します。
lst.clear() #lst=[]
#要素の整列
sortメソッド .sort()
は対象となるリストそのものを変更します。
lst = [4, 2, 3, 1]
lst.sort()
lst #lst = [1, 2, 3, 4]
逆にsorted関数は対象のリストは変更しません。
lst = [4, 2, 3, 1]
sorted(lst) #lst = [1, 2, 3, 4]
lst #lst = [4, 2, 3, 1]
#順序の反転
同様に、reverseメソッド .reverse()
は対象となるリストそのものを変更します。
lst = [4, 2, 3, 1]
lst.reverse()
lst #lst = [1, 3, 2, 4]
reversed関数も対象のリストは変更しません。ただし、reversed関数はリストではなくイテレータを返すので注意が必要です。
lstA = [4, 2, 3, 1]
lstB=list(reversed(lstA))
print(lstB) #lstB = [1, 3, 2, 4]
print(lstA) #lstA = [4, 2, 3, 1]
#リストの複製
Pythonではリストの複製が思ったように出来ないケースが散見されます。これはオブジェクトに固有の識別値が割り振られているためであり、元のリストと自分が複製した(と思っている)リストが同じIDかどうかに気を付けなければなりません。
つまり、下記のようなコードではうまくコピーできません。
lstA = [4, 2, 3, 1]
lstB = lstA
lstB.sort()
print(lstB) #lstB = [1, 3, 2, 4]
print(lstA) #lstA = [1, 3, 2, 4]
元のリストと別のリストを用意するにはcopy関数を使用すると便利ですが、その場合はcopyモジュールをインストールする必要があります。
import copy
lstA = [4, 2, 3, 1]
lstB = copy.copy(lstA)
lstB.sort()
print(lstB) #lstB = [1, 3, 2, 4]
print(lstA) #lstA = [4, 2, 3, 1]
他にもスライシングを用いた複製方法もあります。
lstA = [4, 2, 3, 1]
lstB = lstA[:]
lstB.sort()
print(lstB) #lstB = [1, 3, 2, 4]
print(lstA) #lstA = [4, 2, 3, 1]
浅いcopy copy.copy()
と深いcopy copy.deepcopy()
の違いに関してですが、浅いコピーでは、オブジェクト内のオブジェクトまでコピーをしてくれず、深いコピーでは再帰的にコピーを行うようです。
#2次元配列を1次元配列にする(flatten)
numpyやitertoolsを使わずに2次元配列を1次元配列に変換するにはどうすればいいのかと試行錯誤した結果です。
print(lstA) #lstAを確認
lstB = []
for i in lstA: #lstAのi番目の要素を選択
for j in i: #lstAのi番目の要素の中のj番目の要素を選択
lstB.append(j) #lstBに選択した要素を追加
print(lstB)
[[1, 3], [1, 2, 3], [3, 2]]
[1, 3, 1, 2, 3, 3, 2]
##flattenの関数化
せっかくなので関数にしましょう。
def flatten(lstA):
lstB = []
for i in lstA: #lstAのi番目の要素を選択
for j in i: #lstAのi番目の要素の中のj番目の要素を選択
lstB.append(j) #listBに選択した要素を追加
return lstB
内包表記によるflatten関数はこのようになります。
def flatten(mat):
return [x for row in mat for x in row]
2次元配列の場合、sum関数を利用する方法があるようです。非常に簡単ですね。
lstA=[[1, 3], [1, 2, 3], [3, 2]]
sum(lstA, [])
[1, 3, 1, 2, 3, 3, 2]
おわりに
読んでいただきありがとうございました。指摘等ございましたらコメントお願いします。