リスト (list型オブジェクト)

リスト (list型オブジェクト)

リストの定義と基本操作

 この記事では、Python における リスト の定義、置換、削除、スライス、連結などを解説します。Python のリスト機能は柔軟性があって扱いやすく、データ分析や統計処理で頻繁に活用されます。
 リストは複数の要素(数値や文字などのデータ)にインデックス(見出し番号)を割り当てて、ひとまとまりにしたもので、Python では

[要素0, 要素1, 要素2, 要素3, ...... ]

という形式で定義されます。インデックスは必ず 0 から始まります。1 個目の要素には 0 、10 個目の要素には 9 が割り振られます。

 Python リストとインデックス

 フルーツのリストを作って、type()関数でデータ型を調べてみましょう。

# LIST_01-1

# フルーツのリスト
fruits = ["りんご", "みかん", "バナナ"]

# fruitsのクラスを取得
tp = type(fruits)

# fruitsのクラスをを表示
print(tp)
<class 'list'>

 データ型は list と表示されましたね。
 リストそれ自体も数値や文字列と同じように1つのデータ型として扱われます。
 listオブジェクト は [コンテナ型 - シーケンス型] に分類されます。

 次のコードでリストを表示させてみましょう。

# LIST_01-2

# fruitsを表示
print(fruits)
['りんご', 'みかん', 'バナナ']

 

リストから要素を取り出します

 リストから特定要素を抜き出すときは、リスト名にインデックスを [ ] で括って添えて

リスト名[要素番号]

と記述します。fruits から1つめの要素を取り出してみます。1つめの要素にはインデックス 0 が割り当てられていることに注意してください。

# LIST_01-3

# リストの1番目の要素の取り出し
print(fruits[0])
りんご

 

リストの要素を置き換えます

 リストの要素を別の要素に置き換えることもできます。

リスト名[インデックス] = 新しい要素

 お菓子のリストを作って、2番目の要素を置き換えてみます:

# LIST_02

# お菓子のリスト
sweets = ["チョコレート", "チーズケーキ", "アップルパイ"]

# リストの2番目の要素"チーズケーキ"を"抹茶プリン"に置き換える
sweets[1] = "抹茶プリン"

# sweetsを表示
print(sweets)
['チョコレート', '抹茶プリン', 'アップルパイ']

 2番目の要素が '抹茶プリン' に置き換わりました。
 

リストを連結します

 算術演算子「+」を使うと、2 種類のリストを連結することができます。

# LIST_03

# フルーツのリスト
fruits = ["りんご", "みかん", "バナナ"]

# お菓子のリスト
sweets = ["チョコレート", "チーズケーキ", "アップルパイ"]

# リストを連結
fruits_and_sweets = fruits + sweets

# 連結されたリストを表示
print(fruits_and_sweets)
['りんご', 'みかん', 'バナナ', 'チョコレート', 'チーズケーキ', 'アップルパイ']

 

リストの要素を削除します

 リストの要素を削除したいときは del文を使います。

# LIST_04

# Pythonのパッケージのリスト
packages = ["NumPy", "SciPy", "SymPy"]

# リストの2番目の要素を削除
del packages[1]

# packagesを表示
print(packages)
['NumPy', 'SymPy']

 

スライスでリストから複数の要素を取り出します

 Python のリストにはスライスというユニークな機能が備わっています。その名の通り、玉ねぎを包丁でスライスするような感覚で連続した要素をまとめて取り出すことができます。ただ、スライスという言葉は指定した要素をリストから削除するような誤解を与えてしまうかもしれません。しかし実際には取り出した要素をコピーして新しいリストを作るだけで、元のリストの中身が変わるわけではありません。リストをスライスしたいときは、

[最初のインデックス : 最後のインデックス + 1]

という形式で記述します。

 Python リストのスライス

# LIST_05-1

# 猫の品種リスト
cats = ["マンチカン", "メインクーン", "アビシニアン", "ベンガル", "ヒマラヤン"]

# リストの2番目から4番目の要素を抽出
cats_2 = cats[1:4]

# cats_2を表示
print(cats_2)
['メインクーン', 'アビシニアン', 'ベンガル']

 スライスするときにコロン (:) の左右は省略することができます。右側を省略すると指定したインデックスから最後までの要素を全部取り出します。左側を省略すると最初の要素から、インデックスまでの要素を取り出します。

# LIST_05-2

# 3番目以降のすべての要素を取り出す
cats_3 = cats[2:]

# 最初から2つめまでの要素を取り出す
cats_4 = cats[:2]

# cats_3とcats_4を表示
print(cats_3)
print(cats_4)
['メインクーン', 'アビシニアン', 'ベンガル']
['マンチカン', 'メインクーン']

 

リストのメソッド一覧

list.append()

 list.append(x) はリストの末尾にオブジェクト x を付け加えます。mylist.append(x) は参照代入 mylist[len(mylist):] = [x] と同じ操作です。

# APPEND-1

# リストを定義
animals = ["キリン", "カバ"]

# リストの末尾に"シマウマ"を追加
animals.append("シマウマ")

# 変更されたリストを表示
print(animals)
['キリン', 'カバ', 'シマウマ']

 追加できるオブジェクトは1つです。
 複数の文字列を追加しようとすると TypeError を送出します。

animals.append("サイ", "ゾウ")
TypeError: append() takes exactly one argument (2 given)

 複数要素をもつリストは1つのオブジェクトなので末尾に追加することはできます。しかし、その場合はリストの入れ子になります。

# APPEND-2

# リストの末尾にリストを追加
animals.append(["サイ", "ゾウ"])

# 変更されたリストを表示
print(animals)
['キリン', 'カバ', 'シマウマ', ['サイ', 'ゾウ']]

 特別な事情で入れ子リストを作成したいこともあるかもしれません。しかし、ほとんどの場合、このような実行結果は望まないはずです。複数要素をまとめて追加したいときは後述する list.extend() を使ってください。
 

list.extend()

 list.extend() はリストの末尾にイテラブルオブジェクトの要素を追加して、リストを拡張します。

# EXTEND-1

# リストを定義
animals = ["ライオン", "トラ"]

# リストの末尾に複数要素を追加
animals.extend(["ヒョウ", "チーター"])

# 変更されたリストを表示
print(animals)
['ライオン', 'トラ', 'ヒョウ', 'チーター']

 list.append() はオブジェクトそのものを追加するメソッドでしたが、list.extend() はオブジェクトの「中身」を追加します。したがって、タプルを渡しても同じ結果が得られます。

# EXTEND-2

# リストを定義
animals = ["ライオン", "トラ"]

# リストの末尾に複数要素を追加
animals.extend(("ヒョウ", "チーター"))

# 変更されたリストを表示
print(animals)
['ライオン', 'トラ', 'ヒョウ', 'チーター']

 

list.insert()

 list.insert(i,x) はインデックス i の位置に1つのオブジェクト x を挿入します。メソッド適用以前にインデックス i の位置にあった要素は i + 1 の位置に移動します。

# INSERT

# リストを定義
animals = ["コアラ", "カンガルー", "クスクス"]

# インデックス1の位置に文字列を挿入
animals.insert(1, "ウォンバット")

# 変更されたリストを表示
print(animals)
['コアラ', 'ウォンバット', 'カンガルー', 'クスクス']

 list.append() と同様に、挿入できるのは単独オブジェクトであり、複数の文字列を渡すことはできません。
 

list.pop()

 list.pop() はリストから要素を1つ削除して、削除した要素を返すメソッドです。
 引数を省略するとリストの末尾の要素を削除します。

# POP-1

# 川端康成の作品リスト
kawabata = ["雪国", "古都", "伊豆の踊り子", "山の音", "たんぽぽ"]

# リストの末尾の要素を削除
print(kawabata.pop())

# 変更されたリストを表示
print(kawabata)
たんぽぽ
['雪国', '古都', '伊豆の踊り子', '山の音']

 list.pop() に整数を渡すと、対応するインデックスの要素を返します。

# POP-2

# 川端康成の作品リスト
kawabata = ["雪国", "古都", "伊豆の踊り子", "山の音", "たんぽぽ"]

# 3番目(インデックス2)の要素を削除
print(kawabata.pop(2))

# 変更されたリストを表示
print(kawabata)
伊豆の踊り子
['雪国', '古都', '山の音', 'たんぽぽ']

 

list.remove()

 list.remove(x) は x に等しい最初の要素を削除します。

# REMOVE-1

# 夏目漱石の作品リスト
soseki = ["三四郎", "こころ", "坊ちゃん", "道草", "夢十夜"]

# "道草"を削除
soseki.remove("道草")

# 変更されたリストを表示
print(soseki)
['三四郎', 'こころ', '坊ちゃん', '夢十夜']

 x に該当する要素がリストになければ、ValuError が発生します。

# REMOVE-2

# 夏目漱石の作品リスト
soseki = ["三四郎", "こころ", "坊ちゃん", "道草", "夢十夜"]

# "倫敦塔"を削除
soseki.remove("倫敦塔")
ValueError: list.remove(x): x not in list

 

list.clear()

 list.clear() はリストの全要素を削除します。

# CLEAR

# 宮沢賢治の作品リスト
kenji = ["注文の多い料理店", "銀河鉄道の夜", "セロ弾きのゴーシュ"]

# リストの要素を全て削除
kenji.clear()

# 変更されたリストを表示
print(kenji)
[]

 戻り値は空白のリスト [] となっています。
 

list.copy()

 list.copy() はリストの浅いコピー (shallow copy) を返します。

# COPY

# リストを作成
egg = ["オムレツ", "目玉焼き", "スクランブルエッグ"]

# リストのコピー
x = egg.copy()

print(x)
['オムレツ', '目玉焼き', 'スクランブルエッグ']

 

list.index()

 list.index(x, [start, [end]]) は第 1 引数で指定した値に一致する最初の要素のインデックスを返します。

# INDEX-1

# リストを作成
tofu = ["湯豆腐", "揚げ豆腐", "麻婆豆腐", "肉豆腐"]

# 指定要素のインデックスを取得
idx = tofu.index("揚げ豆腐")

print(idx)
1

 オプション引数 start, end で探索範囲を指定できます。
 戻り値はリストの先頭からの位置です。

# INDEX-2

# リストを作成
num = [1, 0, 6, 8, 0, 2, 5, 9, 3, 0]

# インデックス3~9の範囲で0を探す
x = num.index(0, 3, 9)

print(x)
4

 コード INDEX-2 の例では、インデックス 3 ~ 9 の範囲に 0 が 2 つありますが、インデックスの小さいほうの 4 の位置を返します。
 

list.count()

 list.count(x) は x に一致する要素の数を返します。

# COUNT

# リストを作成
num = [2, 0, 1, 1, 8, 1, 9, 3, 6, 1, 7, 1, 5]

# リストに含まれる1の個数を数える
x = num.count(1)

print(x)
5

 リストの要素の並べ替えについては別記事で解説しています。
 

 

東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~

新品価格
¥3,218から
(2019/8/6 11:41時点)

組み込み関数によるリストの操作

 Python には外部から import しなくても使える組み込み関数が用意されています。この章では組み込み関数を使って リストの合計値や最大値・最小値・長さ を求める方法を解説します。

リストの合計値

 リストの要素を合計するときは sum()関数 を使います。

# リストLIST_15

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# リストの合計値
x = sum(etest)

print(x)
367

 

リストの最大値

 max() はリストから最大要素を返します。

# リストLIST_16

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# リストの最大値
x = max(etest)

print(x)
90

 

リストの最小値

 min() はリストから最小要素を返します。

# リストLIST_17

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# リストの最小値
x = min(etest)

print(x)
58

 

リストの長さ

 len() はリストの長さ、すなわち要素の個数を返します。

# リストLIST_18

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# リストの長さ(要素の個数)
x = len(etest)

print(x)
5

 

リストの平均値

 sum() と len() を組合わせると、リストの平均値を計算することができます。

# リストLIST_19

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# 平均点を計算
mean_etest = sum(etest)/len(etest)

print(mean_etest)
73.4