LoginSignup
25
25

More than 3 years have passed since last update.

【Python】リスト操作まとめ

Last updated at Posted at 2019-02-25

はじめに

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]

おわりに

読んでいただきありがとうございました。指摘等ございましたらコメントお願いします。

25
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
25