\ ポイント最大11倍! /

【Python】リスト操作の基礎を解説【実務テクニック中心】

  • Python のリストを使いこなせるようになりたい!

このような方に向けて書きました。

プログラミングを始めて感じる関門の一つがリストの操作です。

とはいえ一度要領がわかってしまえば、リストの操作はとても簡単。

本記事では実務で使うテクニックを中心に、Python のリスト操作方法をまとめました

目次がリンクになっています。

だいぶ記事のボリュームがあるので、目次をクリックして情報にアクセスしてください。

「基本操作」編

以下のような「よく使うリスト操作方法」をご紹介します。

  • 特定の要素が含むかを調べる
  • 空のリストの作り方
  • リストの要素数を取得する方法
  • タプルをリストに変換

頻出のテクニックなので、早めに理解しておきましょう。

特定の要素が含むかを調べる

リスト内に特定の要素を含むかどうかはinを使います。
戻り値はTrueまたはFalseです。

is_include = "iPhone" in ["iPhone", "iMac", "iCloud"]
print(is_include)

# 出力結果
# True

これを利用してif文で条件分岐させることが頻繁に行われます。

my_bag = ["iPhone", "iMac", "iCloud"]
if "iPhone" in my_bag:
    print("Ready!")
else:
    print("I forgot my iPhone...")

# 出力結果
# Ready!

もちろん、if notとすることで「存在しない」ことも確認できます。

空のリストの作り方

からのリストを作成する場合には、変数に[]を指定します。

empty_list = []

append()で要素を追加していく際に、まず空のリストを用意することがよくあります。

リストの要素数を取得する方法

リストの要素数はlen()メソッドで取得できます。

target_list = ["iPhone", "iMac", "iCloud"]
size = len(target_list)
print("size: ", size)

# 出力結果
# size:  3

使い時としては、以下のようなケースがあります。

  • 空のリストか確認
  • 狙った通りの要素数か確認
  • ループ回数の制御

結構頻繁に利用する、便利な機能です。

タプルをリストに変換

タプルだと要素の変更が効かないので、リストにしたい場合があります。

この場合、タプルに対してlist()関数を使いましょう。

target_tupple = ("iPhone", "iMac", "iCloud")
target_list = list(target_tupple)
print(target_list)

# 出力結果
# ['iPhone', 'iMac', 'iCloud']

余談ですが、変数名としてlistを使ってしまうと上記のlist()関数にアクセスできなくなってしまいます。

「関数適用」編

リストの全要素に対して特定の処理をさせる関数が用意されています。

  • map()関数:全要素に関数を適用
  • filter()関数:条件に合致した要素のみを残す

データ分析などの文脈で使われることが多いので、ぜひマスターしていきましょう!

map()関数の使い方

リストの全要素に対して特定の関数を適用し、新たなリストを作る関数です。

基本的な文法は以下の通り。

map(function, list)

listにあたる部分には辞書やタプルなども渡せますが、ここではリストに絞って解説します。

例えばリストの全要素を2倍したい場合には、以下です。

def double(x):
    return x * 2

numbers = [1, 2, 3, 4, 5]
result = map(double, numbers)
print("result: ", list(result))

# 出力結果
# result:  [2, 4, 6, 8, 10]

複数のリストに対して関数を適用することもできます。

numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
result = map(lambda x, y: x + y, numbers1, numbers2)
print("result: ", list(result))

# 出力結果
# result:  [5, 7, 9]

上記ではそれぞれのリストから要素を一つずつ取り出し、合計します。

map()関数の結果はイテレータを返すので、list()でリストに変換する必要があります。

map()関数とlambdaを併用する方法

一般的にmap()関数はラムダ関数と併用されることが多いです。

全要素を2倍するコードをラムダ関数で表現したものが以下になります。

numbers = [1, 2, 3, 4, 5]
result = map(lambda x: x * 2, numbers)
print("result: ", list(result))

# 出力結果
# result:  [2, 4, 6, 8, 10]

ラムダ式の部分を要素分解して解説します。

  • lambda x:: 引数をxとする関数を定義
  • x * 2: 関数で実行される計算式

一般的には関数名(引数):lambda 引数:に置き換わった形と考えるとわかりやすいです。

関数名の代わりにlambdaが使われるので関数名を定義する必要がありません。ラムダ関数が無名関数と呼ばれる所以です。

filter()関数の使い方

リストの全要素から、特定の条件に合致するものだけを抽出する関数です。

基本的な使い方は以下の通り。

filter(function, list)

functionにはブール値(True, False)を返す関数を用意してください。

以下はリストから偶数だけを抽出するコード例です。

def is_even(x):
    return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
filtered_numbers = filter(is_even, numbers)
print("filtered_numbers: ", list(filtered_numbers))

# 出力結果
# [2, 4, 6]

つまり、is_even()関数でTrueを返したもののみ抽出される流れとなります。

filter()関数の結果もイテレータを返すので、list()でリストに変換する必要があります。

filter()関数とlambdaを併用する方法

lambdaと併用する場合には短いコードで表現できます。

numbers = [1, 2, 3, 4, 5, 6]
filtered_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(filtered_numbers))

filter()関数の第一引数をlambdaに置き換えた形ですね。

「要素追加」編

元々あるリストに要素を追加する場合、以下のバリエーションがあります。

  • 末尾に追加
  • 指定位置にを挿入
  • 他のリストを連結
  • 指定位置に他のリストを挿入

それぞれ、解説します。

末尾に追加

リストの最後に要素を追加したい場合にはappend()メソッドを使います。

コード例を示します。

target_list = ["iPhone", "iMac", "iCloud"]
target_list.append("MacBook")
print(target_list)

# 出力結果
# ['iPhone', 'iMac', 'iCloud', 'MacBook']

リストの最後に “MacBook” が追加されました。

指定位置にを挿入

末尾以外に要素を追加したい場合にはinsert()メソッドを使います。

第一引数に挿入先のインデックス番号を指定します。

target_list = ["iPhone", "iMac", "iCloud"]
target_list.insert(1, "MacBook")
print(target_list)

# 出力結果
# ['iPhone', 'MacBook', 'iMac', 'iCloud']

上記の通り、”MacBook” がインデックス番号1(2番目)に追加されました。

同じ要領でリストの先頭に要素を追加したい場合には、第一引数に0を渡せば OK です。

他のリストを連結

リストとリストを結合する場合にはextend()メソッドを使います。

original_list = ["iPhone", "iMac", "iCloud"]
additional_list = ["MacBook", "AppleWatch"]
original_list.extend(additional_list)
print(original_list)

# 出力結果
# ['iPhone', 'iMac', 'iCloud', 'MacBook', 'AppleWatch']

出力結果は以下になります。

extend()の引数に渡したリストが末尾に追加される形になります。

ちなみに、extend()の代わりに+を使っても OK です。

original_list = ["iPhone", "iMac", "iCloud"]
additional_list = ["MacBook", "AppleWatch"]
original_list += additional_list


print(original_list)
# 出力結果
# ['iPhone', 'iMac', 'iCloud', 'MacBook', 'AppleWatch']

ただし、間違えてappend()関数を実行してしまいます。

original_list = ["iPhone", "iMac", "iCloud"]
additional_list = ["MacBook", "AppleWatch"]
original_list.append(additional_list)
print(original_list)

# 出力結果
# ['iPhone', 'iMac', 'iCloud', ['MacBook', 'AppleWatch']]

上記のように、変な出力結果になってしまいました。

指定位置に他のリストを挿入

他のリストを指定した位置に挿入するには、スライスを使います。

original_list = ["iPhone", "iMac", "iCloud"]
additional_list = ["MacBook", "AppleWatch"]
original_list[2:2] = additional_list
print(original_list)

# 出力結果
# ['iPhone', 'iMac', 'MacBook', 'AppleWatch', 'iCloud']

元のリストのインデックス番号2番(つまり最初から数えて3番目)に、追加したいリストが挿入されたことがわかります。

スライスとして異なる番号を指定すると、指定したインデックス番号の要素と追加したいリストが置き換わります。

original_list = ["iPhone", "iMac", "iCloud"]
additional_list = ["MacBook", "AppleWatch"]
# 元のリストの 1~2 と追加リストに置き換える
original_list[1:2] = additional_list
print(original_list)

# 出力結果
# ['iPhone', 'MacBook', 'AppleWatch', 'iCloud']

「要素削除」編

元々あるリストに要素を削除する方法には、以下のバリエーションがあります。

  • すべて削除
  • 特定の要素を削除して値取得
  • 特定の値を削除
  • 範囲指定して削除

それぞれ解説していきます。

すべて削除

リスト内を空っぽにするには、clear()メソッドを使います。

original_list = ["iPhone", "iMac", "iCloud"]
original_list.clear()
print(original_list)

# 出力結果
# []

特定の要素を削除して値取得

pop()メソッドに削除したいインデックス番号を渡すと、要素が削除されて戻り値として削除された要素が返ってきます。

original_list = ["iPhone", "iMac", "iCloud"]
element_1 = original_list.pop(1)
print("element_1:", element_1)
print("original_list", original_list)

# 出力結果
# element_1: iMac
# original_list ['iPhone', 'iCloud']

最後尾にある要素を取得するには、インデックス番号として-1を指定すれば OK です。

original_list = ["iPhone", "iMac", "iCloud"]
element_minus1 = original_list.pop(-1)
print("element_minus1:", element_minus1)
print("original_list", original_list)

# 出力結果
# element_minus1: iCloud
# original_list ['iPhone', 'iMac']

マイナスで指定すると、後ろ側から要素を取得してくれます。

-2とすれば、後ろから二番目の要素を取得します。

特定の値を削除

値を直接指定して削除するにはremove()メソッドを使います。

original_list = ["iPhone", "iMac", "iCloud", "iPhone"]
original_list.remove("iPhone")
print("original_list", original_list)

# 出力結果
# original_list ['iMac', 'iCloud', 'iPhone']

ただし、この方法では最初に見つかった要素しか削除しません。上記の例でも0番目の “iPhone” は削除されたものの、最後尾にある “iPhone” は残ったままです。

すべての値を削除するには、次のようにリスト内包表記を用います。

original_list = ["iPhone", "iMac", "iCloud", "iPhone"]
new_list = [elm for elm in original_list if elm != "iPhone"]
print("new_list", new_list)

# 出力結果
# new_list ['iMac', 'iCloud']

リスト内包表記は別記事で詳しく解説しました。書き方に自信がない方は合わせてご覧になってみてください。

範囲指定して削除

インデックス番号の範囲を指定して要素を削除するにはdelを使います。

original_list = ["iPhone", "iMac", "iCloud", "iPhone"]
del original_list[0:2]
print("original_list", original_list)

# 出力結果
# original_list ['iCloud', 'iPhone']

スライスの場合には右側に書いた2を含みません。そのため、上記の例ではインデックス番号01番目が削除されることになります。

もちろん、通常のスライスの機能が使えますので以下のような範囲選択も可能です。

original_list = ["iPhone", "iMac", "iCloud", "iPhone"]
del original_list[-2:]
print("original_list", original_list)

# 出力結果
# original_list ['iPhone', 'iMac']

まとめ

リストの操作は以下のようなものがありました。

  • 基本的な操作
  • 全要素に関数を適用
  • 要素を追加
  • 要素を削除

今回の記事にあるものを理解することで、基本的なリスト操作は困らないレベルになるかと思います。

ご不明点などはコメント欄からお気軽にどうぞ!

本ブログでは他にも Python に関する記事をアップしています。ご興味のある方は以下のリンクからどうぞ。

» 参考:CFXLOG – Python に関する記事一覧

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Python(Django)が得意。最近ではフロント側の技術に触れる機会も増えてきました。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)