ロゴ

プログラミング初心者がアプリ開発を目指すブログ

【Python入門】Pythonリストの操作(続き) – Python初心者勉強記005

今回はリスト操作の続きです。
リストのソートや要素の削除の仕方などを見て行きましょう。

リストのソート

リストのソートは大きく分けて、2種類あります。
自分自身を変更するものと新しいリストをつくるものです。

・自分自身を変更するソート
リスト自身を変更するには.sortを使います。

.sort(cmp=比較方法の関数,key=キーとなる関数,reverse=真偽)
比較方法の関数とは例えば、数字の大小の比較であったり、文字の長さの比較を行う関数を指します。
キーとなる関数とは、数値を2乗するとか、-1を掛けるといった操作です。
cmpとkeyを設定することで「数値を2乗してから大小の比較を行う」といった操作が可能です。

また、.reverseでリストを逆順に並び替えることができます。


>>> a=[1,3,5,7]
>>> a.sort()
>>> a
[1, 3, 5, 7]
>>> a.sort(reverse=True)
>>> a
[7, 5, 3, 1]
>>> a=[1,3,5,7]
>>> a.reverse()
>>> a
[7, 5, 3, 1]
>>> a=[[1,7,3],[1,6],[2]] #各リストの左端から数値を比較していく
>>> a.sort()
>>> a
[[1, 6], [1, 7, 3], [2]]
>>> a.sort(key=len) #各リストの長さを比較していく
>>> a
[[2], [1, 6], [1, 7, 3]]

・新たなリストを返すソート
sorted(リスト,cmp=比較方法の関数,key=キーとなる関数,reverse=真偽)
reversed(リスト)
で新たなリストを返すソートを行うことができます。

sortedの引数のcmp,keyは.sort()と一緒です。

リストの削除

要素を指定して削除を行うときは、
.remove(要素)

インデックスで削除を行うときは、
del リスト[開始インデックス:終了インデックス:ステップ]
を使用します。


>>> a=['A','B','C','D','E']
>>> a.remove('C')
>>> a
['A', 'B', 'D', 'E']
>>> a=['A','B','C','D','E']
>>> del a[1:5:2]
>>> a
['A', 'C', 'E']

リストのコピー

少し話が込み入っていきます。

例えば、リストを格納する変数を別の変数に代入しましょう。


>>> a=[2,3,4]
>>> b=a
>>> b[1]='a' #bを変更すると
>>> a
[2, 'a', 4] #aも変わる

見ていただいた通り、代入先(b)を変更すると代入元(a)も変更されてしまいます。
これはどういうことなのかと言うと、
b=aという操作によって、aの参照(コンピュータ上の場所とか倉庫と考えてください)がbにコピーされたということです。
aとbは同じ倉庫を指している状態なので、
bの倉庫の中身を変更すると、aの倉庫の中身も変更されます。(aとbは同じ倉庫なので当たり前ですね)

上記のようなことを避けるためには、リストのコピーを行います。
リストのコピーには「浅いコピー」と「深いコピー」の2種類あります。

・浅いコピー
リスト[:]

浅いコピーはリストの各要素をコピーしてくれます。
しかし、コピーした要素が参照する値まではコピーしません。

つまり、リストのなかにリストがある場合は、最初に見たような現象が発生します。
実際に見てみましょう。


>>> a=[1,2,3]
>>> b=a[:] #浅いコピー
>>> b[1]='a' #代入先を変更しても
>>> a
[1, 2, 3] #代入元は変化しない

a=[1,[2,2],3] #リストの中にリスト
>>> b=a[:] #浅いコピー
>>> b[1].append('a') #代入先の要素のリストを変更
>>> a
[1, [2, 2, 'a'], 3] #代入元が変化!

見ていただいた通り、リストの中にリスト(子リストと名づけます)がある場合は、
子リストが指す倉庫の場所がコピーされるだけで、
子リストの倉庫内の値がコピーされるわけではありません。

よって子リストの倉庫内の値を変えると、親リストにも影響が出ています。(親リストも同じ倉庫を指しているから)
これを避けるには深いコピーを使用します。

・深いコピー
深いコピーを行うには、コピーモジュールをimportします。
import copy
copy.deepcopy(リスト)

深いコピーはリストの要素の参照をすべて辿って、データをコピーしてくれます。


>>> import copy
>>> a=[1,[2,2],3]
>>> b= copy.deepcopy(a) #深いコピー
>>> b[1].append('a') #参照先を変更
>>> a
[1, [2, 2], 3] 参照元には影響しない

これでリストの中にリストがあっても、データだけを取り出してコピーすることができました。
これらをしっかりと使い分けましょう。

リストの比較

リストの比較は3種類あります。
等価比較(==,!=) すべての要素が同一かどうか比較
大小比較(<,>,<=,>=) 左から順に大小比較
is比較(is)オブジェクトそのものが同一か比較

リストの内包表記

リストの各要素に処理を行う場合は内包表記を使用すると便利です。
[新たに追加する要素 for 取り出した要素 in 対象リスト if 条件式]

例えば、リストの各要素を2倍したリストを作りたいときは

>>> a=[1,2,3,4,5,6]
>>> [i*2 for i in a]
[2, 4, 6, 8, 10, 12]

奇数のものだけ2倍して取り出したリストを作りたいときは


>>> a=[1,2,3,4,5,6]
>>> [i*2 for i in a if i % 2]
[2, 6, 10] #1,3,5が2倍されて出てきた

今回でリストの操作はお終いです。
なかなかに長かったですね。
次回からはdictionaryについて説明していきます。

Python入門講座の次の記事はこちら => 【Python入門】Python Dictionaryの作成 – Python初心者勉強記006

スポンサード リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA