初心者向け

【Python】リスト型の使い方と注意点

  • このエントリーをはてなブックマークに追加

リストの作成

Pythonのリストは次のように単純に生成できます。

a = [3, 2, 1]

空のリストも作ることができます。

a = []
a = list()

慣れると便利!内包表記

また、内包表記という便利な方法もあります。
forを使って次のように生成することができます。

a = [2*i for i in range(10)]
print(a)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

次のように書くことで全部同じ値の配列を作るのも簡単です。

a = [7 for _ in range(10)]
# [7, 7, 7, 7, 7, 7, 7, 7, 7, 7]

内包表記は一見むずかしいですが慣れるとさまざまなリストが簡単に生成できます。

要素の追加

appendで要素を追加

リストに値を追加するのはappendメソッドを使います。

a = [2,1,4]
a.append(5)
print(a)
# [2, 1, 4, 5]

加算演算を利用

加算演算を利用することで要素の追加もできます。

a = [2,1,4]
a += [5]
print(a)
# [2, 1, 4, 5]

リストの連結

expandでリストを連結

配列の連結にはextendメソッドを使います。

a = [2,1,4]
b = [3,4,5]
a.extend(b)
print(a)
# [2, 1, 4, 3, 4, 5]

加算演算を利用

加算演算を利用することでリストの連結をできます。

a = [2,1,4]
b = [3,4,5]
a += b
print(a)
# [2, 1, 4, 3, 4, 5]

要素の削除

要素を指定する場合はremove

a = [2,3,4]
a.remove(1)
print(a)
# [2,4]

添え字を指定する場合はpopかdel

popで添え字を指定して値を取出すことができます。
popの戻り値は取出した値です。

a = [2,3,4]
x = a.pop(2)
print(a)
# [2,3]
print(x)
4

delによる場合の書き方は次のようになります。

a = [2,3,4]
del a[0]
print(a)
# [3,4]

重複を削除する場合はset

配列から重複する要素を削除したい場合は、
setオブジェクトに変換してlistに再度変換します。

a = [2,7,2,2,4,1,5,7]
a = list(set(a))
print(a)
# [1, 2, 4, 5, 7]

複数の要素を取り除く場合はfilter

偶数を配列から取り除くコードです。

a = list(range(10))
print(a)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a = list(filter(lambda x:x % 2 == 0, a))
print(a)
# [0, 2, 4, 6, 8]

Noneを取り除くときは次のようにかけます。

a = [1,None,7,None]
a = list(filter(lambda x:x,a))
print(a)
# [1,7]

リストの長さ

len(リスト)

で配列の長さを取得できます。

a = list(range(100))
print(len(a))
# 100

要素の検索

indexメソッドで配列を検索出来ます。
検索したい要素を渡すと、添え字を返します。

a = [2,7,5]
print(a.index(7))
# 1

リストの反転

reverseメソッドでリストの反転ができます。

a = [2,7,5]
a.reverse()
print(a)
# [5,7,2]

スライス機能を使う

次のようにスライス機能を使っても反転できます。

a = a[::-1]
print(a)
# [5,7,2]

リストにまつわる判定

要素が含まれているかの判定

a = [2,7,5]
2 in a
# True
1 in a
# False

空かどうかの判定

空配列はそれ自身、Falseと判定されます。


a = []
if a:
  print('空じゃないです')
else:
  print('空です')

lenを使って0と比較する必要がないので楽です。

リストのスライス

list[開始位置:終了位置:間隔]
a = [3,1,8]
a[1:]
# [1,8]
a[:-1]
# [3,1]
a[::2]
# [3, 8]

リストを代入・コピーするときは注意

リストの代入演算子の挙動に注意

Pythonのリストは次のような挙動になります。

a = [1,2,3]
b = a
b.remove(1)
print(a)
# [2,3]

注目してほしいのはabに代入して、
bに変更を加えるとaにも変更が加わってしまう点です。
これは、Pythonのリスト変数は
リストそれ自体を指すのではなくリストのアドレス(ポインター)だからです。
リストに限らずPythonオブジェクトの変数は、
値ではなくそれのメモリ上の位置を指し示すので気を付けましょう。
他にもつぎのようにメソッド内でリストを参照するときの挙動にも気を付けましょう。

def get_first(arg):
    return arg.pop(0)
a = [1,2,3]
print(get_first(a))
# 1
print(a)
# [2,3]

安全なコピーの方法

リストaをリストbに安全にコピーするにはいくつか方法があります。
ただし、要素がintやfloatなどの値型に限ります。
要素がオブジェクトの場合、後述のdeepcopyを利用します。

a = [1,2,3,4]
b = a.copy()# copyメソッドを利用する(Python3.3以降)
b= a[:]# スライスを使う
b = list(a)# listを生成する

copyモジュールを使う方法もあります。

import copy
new_list = copy.copy(old_list)

要素がオブジェクトの場合はdeepcopyを利用しましょう。

import copy
new_list = copy.deepcopy(old_list)
  • このエントリーをはてなブックマークに追加