リストを編集する

リストを使うと、データをカタマリとして扱い、便利な機能がたくさんあります。この便利な機能の幅を広げるために、リストを簡単に作ったり、編集(作り変える)方法があります。

リストを作成する

最も基本的な方法は角括弧([ ])による定義ですが、次の方法で簡単にリストを作成することができます。

list関数による方法

list関数を使うと、range関数や文字列との組み合わせで簡単にリストを定義することができます。

  1. #1 list関数で簡単にリストを作成する
  2. list_range = list(range(1,6))
  3. print(list_range)
  4. list_str = list("12345")
  5. print(list_str)

[1, 2, 3, 4, 5]
['1', '2', '3', '4', '5']
2. range関数により整数の範囲を指定し、list関数を適用することにより、[1,2,3,4,5]のように整数のリストになります。なお、リストの名前を”list”としたくなってしまいますが、そうするとlist関数が使えなくなるので、list_rangeにようにリストの性質を示す文字と組み合わせるのがお薦めです。
4. 文字列に対してリスト関数を適用すると、1文字ずつを要素とするリストを作成することができます。ここでは、12345とすべて数字ですが、リストの要素の属性は文字型になります。(list関数に” “無しの数字を指定するとエラーになります。

range関数は「1から5(6の1つ手前)までの整数を並べます」という意味で、関数によってできあがるものをrange型のオブジェクトといいます。

splitメソッドによる方法

文字列からリストを作るもう一つの方法は、splitメソッドによるものです。splitメソッドを使うと、スペースやカンマで区切られた位置を境としてリストを作ることができます。

  1. #2 splitメソッドで文字列をリストの要素に分割する
  2. str_comma = 'Euler,Fermat,Gauss,Riemann'.split(',')
  3. print(str_comma)
  4. str_blank='Euler Fermat Gauss Riemann'.split()
  5. print(str_blank)

['Euler', 'Fermat', 'Gauss', 'Riemann']
['Euler', 'Fermat', 'Gauss', 'Riemann']
2. スペースで区切った文字列に対してsplitメソッドを適用することにより、リストを作成することができます。splitメソッドの引数として、区切りにする記号(ここでは“,”)を指定します。
4. splitメソッドの引数に何も指定しないと、スペース(半角、全角でもOK)を区切りとしてリストを作成します。

joinメソッドでリストを指定した記号で区切した文字列を作成する。

リストに対してjoinメソッドを適用とすると、各要素をつなげて1つの文字列にすることができます。

  1. #3 joinメソッドでリストを文字列や数字に変換する
  2. list_comma=",".join(['1', '2', '3', '4'])
  3. print(list_comma)
  4. list_blank=int("".join(['1', '2', '3', '4']))
  5. print(list_blank)
  6. print(int(list_blank)*2)

1,2,3,4
1234
2468
2. joinメソッドは独特の書き方をします。文字列にしたときに区切りとする文字列に対してjoinメソッドを適用することとして、その引数にリストを指定します。
4. ブランクに対してjoinメソッドを適用すると、リストを分解して1つの文字列にすることができます。すべてが自然数であるリストであれば、joinメソッドを適用した結果にint関数を適用すると自然数となり、これに対して数式演算をすることができます。

リストの編集

リストの要素を置き換える

リストの特定の要素を編集する

一度リストを作成しても、特定の要素を書き換えたり、追加、削除するなどの編集をすることができます。

  1. #4 リストの特定の要素を編集する
  2. list_num=[10,20,30,40,50]
  3. list_num[1]=100
  4. print(list_num)
  5. list_num[1:3]=[100,200]
  6. print(list_num)

[10, 100, 30, 40, 50]
[10, 100, 200, 40, 50]

1. リストに対して角括弧を使いインデックスで要素を指定し、これに対して値を代入すると、その要素を置き換えることができます。ここでは、インデックスとして1を指定しているので2番目の要素を書き換えることができます。
2. 角括弧([])で範囲を指定した要素に、リストを代入すると、代入した要素を使って回抱えることができます。

リストの中で特定の要素を削除する

上記の方法で空のリストを代入すると、指定した要素を削除することができます。

  1. #5 リストの特定の要素を削除する
  2. list_num=[10,20,30,40,50]
  3. list_num[1:3]=[]
  4. print(list_num)
  5. list_num[:]=[]
  6. print(list_num)

[10, 40, 50]
[]
3. リストのスライシングしたものに、空のリスト([])を代入するとスライシングした要素が削除されます。
5. リスト全体を[:]でスライシングし、空のリスト([])を代入するとリストの要素が全て削除されます。

リストの削除

リストから特定の要素を削除するのは、置き換える方法もありますが、popメソッドを使う方が便利なことがあります。

popメソッドでリストの最後の要素を削除する

  1. #6 リストの最後の要素を削除し、その値を返す
  2. list_num=[10,20,30,40,50]
  3. msg=list_num.pop()
  4. print(list_num)
  5. print(msg)

[10, 20, 30, 40]
50
3. リストに対し引数をブランクにしてpopメソッドを適用すると、リストの最後の要素が削除され、その値を返すことができます。
5. このため、3行目でpopメソッドを適用した結果、msgには削除された要素である50が代入されています。

popメソッドでリストの特定のインデックスの要素を削除する

popメソッドの引数にリストのインデックスを指定すると、その要素が削除され、要素の値を返すことができます。

  1. #7 リストの特定の順番の要素を削除し、その値を返す
  2. list_num=[10,20,30,40,50]
  3. msg=list_num.pop(2)
  4. print(list_num)
  5. print(msg)
  6. msg=list_num.pop(-1)
  7. print(list_num)
  8. print(msg)

[10, 20, 40, 50]
30
[10, 20, 40]
50

3. popメソッドの引数にリストのインデックスの2を指定すると、該当する要素(ここでは3番目)が削除され、その値が返されmsgに代入されます。
6. popメソッドの引数に-1を指定すると、最後の要素が削除されます。つまり、popメソッドのデフォルト値は-1ということになります。なお、msg=a.pop(len(a)-1)でも同じ結果になります。

removeメソッド

リストの中で、要素の値を指定してその要素を削除するときにはremoveメソッドを使います。removeメソッドは、同じ値の要素があるときには左側(インデックスの小さい方)から削除され、指定した値が無いときにはエラーになります。

  1. #8 remove 初めに見つかった要素を削除
  2. list_double = [10,20,30,40,50,10,20,30,40,50]
  3. list_double.remove(30)
  4. print(list_double)
  5. list_double.remove(30)
  6. print(list_double)
  7. list_double.remove(30)
  8. print(list_double)

[10, 20, 40, 50, 10, 20, 30, 40, 50]
[10, 20, 40, 50, 10, 20, 40, 50]
ValueError                                Traceback (most recent call last)
2. 2つの30を要素とするリストを定義します。
3. 上記のリストに対し、30を引数としてremoveメソッドを適用すると、インデックスの小さい方の30である要素が削除されます。
5. 同様に30を引数としてremoveメソッドを適用すると、次にインデックスの小さい方の30である要素が削除されます。
7. リストに引数で指定した値が無いときにはエラーとなります。

リストの要素を削除する

リストの全ての要素を削除するためには、clearメソッドやdel関数を使用します。

  1. #9 リストのクリア
  2. list_1 = [10,20,30,40,50]
  3. list_1.clear()
  4. print(list_1)
  5. list_2 = [10,20,30,40,50]
  6. del(list_2[:])
  7. print(list_2)

[]
[]

リストに要素を追加する

リストの特定の位置に要素を挿入する

リストの特定の位置に要素を挿入することができます。

  1. #10 リストの特定の位置に要素を挿入する
  2. list_num=[10,20,30,40,50]
  3. list_num.insert(2,100)
  4. print(list_num)
  5. list_num.insert(len(list_num),200)
  6. print(list_num)
  7. list_num=[10,20,30,40,50]
  8. list_num.append(300)
  9. print(list_num)

[10, 20, 100, 30, 40, 50]
[10, 20, 100, 30, 40, 50, 200]
[10, 20, 30, 40, 50, 300]

3. リストに対してinserメソッドを適用すると、指定した要素を追加することができます。insertメソッドでは次のとおり引数を指定します。なお、インデックスは挿入する位置-1となります。

insert(インデックス、追加する要素)

5. リストの末尾に要素を追加するときには、インデックスをリストの要素数len(リスト名)とします。
8. リストの末尾に要素を追加するときには、appendメソッドを使い、追加する要素を指定することもできます。

リストの結合

リストの末尾に他のリストを結合したり、複数のリストを結合して他のリストを新規に作成することも簡単にできます。

リストの末尾に他のリストを結合する

  1. #11 リストの末尾に他のリストを結合する
  2. list1=[10,20,30,40,50]
  3. list2=[60,70,80]
  4. list1.extend(list2)
  5. print(list1)

[10, 20, 30, 40, 50, 60, 70, 80]
4. リストにextendメソッドを適用すると、引数で指定したリストを後ろに結合することができます。なお、extendメソッドで適用されるのはリスト

リスト同士を結合する

リストに対して*演算子を適用することでリスト同士を結合することができます。

  1. #12 複数のリストを結合する
  2. list_1=[10,20,30,40,50]
  3. list_2=[60,70,80]
  4. list_3=[90,100]
  5. list_4=list_1+list_2+list_3
  6. print(list_4)

[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

5. 定義した3つのリストを+の演算子で加えることにより、結合したリストを新たに定義することができます。

リストをかけ算する

リストに対して、*演算子を適用するとその分の要素がコピーされたリストを作成することができます。

  1. #13 要素を繰り返すリストを作る
  2. nums_x10 = [0] * 10
  3. print(nums_x10)
  4. list_1 = [1, 2, 3]
  5. list_x10=list_1*3
  6. print(list_x10)

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 3, 1, 2, 3, 1, 2, 3]

2. 要素0が1つのリストに対して10を掛けることで、0が10個の要素とするリストを定義することができます。
5. +演算子は、あらかじめ定義したリストに対しても提供することができます。ここでは、要素が3つのリストを3倍すると、123が3つ並んだリストを定義することができます。

リストをコピーする

作成したリストをコピーし、元のリストを残しつつ、別にリストを作成して編集することができます。このようなコピーの方法をディープコピー(DeepCopy)といいます。

コピーして別のコピーを作成するディープコピー

コピーメソッドによるディープコピー

コピーメソッドによりディープコピーをすることができます。

  1. #14 コピーメソッドによるコピー
  2. list1=[10,20,30]
  3. list2=list1.copy()
  4. list2.append(40)
  5. print(list1,list2)

[10, 20, 30] [10, 20, 30, 40]
3. 定義したリストにcopyメソッドを適用すると、新たに を作成することができます。
4. コピーしたリストの末尾に数字40を追加しています。
5. 2つのリストをprintすると、元のリストには変更が加えられていないことがわかります。

スライシングによるディープコピー

スライシングですべての要素を取り出し、別のリストに代入して定義するとディープコピーすることができます。

  1. #15 スライシングによるコピー
  2. list1=[10,20,30]
  3. list2=list1[:]
  4. list2.append(40)
  5. print(list1,list2)

[10, 20, 30] [10, 20, 30, 40]

リストのシャロ―コピー

リストを別のリストに代入すると、別名のリストを作成することができますが、その実態は同じリストになります。このようなコピーの方法をシャロ―コピーといいます。

  1. #16 リストのShallow copy
  2. list1=[10,20,30]
  3. list2=list1
  4. list2.append(40)
  5. print(list1,list2)

[10, 20, 30, 40] [10, 20, 30, 40]
3. list2にlist1を代入し、リストとして定義しています。
4. list2の末尾にappendメソッドで要素40を追加しています。
5. list1の末尾にappendメソッドで要素50を追加しています。
6. list1にも、list2にも末尾に40と50が追加されています。つまり、1つの命令がlist1にもlist2にも効果があることから、両者は実は同じものであることがわかります。

リストの並び替え

リストの要素を並び替えるとき方法として、sortメソッドによる方法とsorted関数による方法があります。元の並び順の情報を残しておきたいときはsortedメソッドを使う必要があります。

sortメソッドでリストそのものを並び替える

リストに対してsortメソッドを適用すると、そのリストそのものを並べ替えることができます。

  1. #17 sortメソッドで
  2. list_s=[40,30,50,10,20]
  3. list_s.sort()
  4. print(list_s)
  5. list_s.sort(reverse=True)
  6. print(list_s)

[10, 20, 30, 40, 50]
[50, 40, 30, 20, 10]
3. 引数をしていしないでsortメソッドを適用すると、もとのリストが昇順(小さい値から大きな値に向けて)で並べ替えることができます。このことにより、元のリストの並び順の情報は残らなくなるので注意が必要です。
5. 引数として(reverse=True)を指定すると、降順(大きな値から小さな値に向けて)並べ替えることができます。

sorted関数で、並べ替えをしたもう一つのリストを作成する

sorted関数を使っても、リストの並び替えをすることができます。sorted関数の結果を別のリストに代入することにより、元のリストの順番を残しつつ、他のリストを作成することができます。

  1. #18 sorted関数でリストを並びかえる
  2. list_s=[40,30,50,10,20]
  3. list_accend=sorted(list_s)
  4. list_decend=sorted(list_s,reverse=True)
  5. print(list_s)
  6. print(list_accend)
  7. print(list_decend)

[40, 30, 50, 10, 20]
[10, 20, 30, 40, 50]
[50, 40, 30, 20, 10]

3. リストに対してsort関数を適用して新たにリストを定義しています。この結果は昇順に並び替えられています。
4. 同じリストに対して、sort関数にreverse=Trueとして適用し、降順で並び替えています。
5. 元のリストの並び順は変化していないことがわかります。