Pythonの基本的なリスト操作についてまとめています。これらは経験豊富なプログラマーにとっては当たり前の操作であり、初心者にとっては、まず身につけておきたいものです。
初心者の方は、まずは上から順番に、ここで書いているリスト操作をマスターして頂ければと思います。
1. リストの最も基本的な操作
まずは、リストの操作のもっとも基本的な部分を解説します。
- リストの作成
- リストのスライス
- リストの置換
- リストの要素数の取得
これらはリストを扱う上で最も基本となる操作ですのでしっかり抑えておきましょう。
1.1. リストの作成
リスト作成法は、まず次の3つをマスターしましょう。
- [] に直接入力で作成
- list()関数で作成
- range()関数で作成
それぞれ解説します。
1.1.1. [] に直接入力で作成
Pythonのリストは、[] の中に要素を一つずつカンマ区切りで書いて作成します。
まず、[] のみで要素を何も書かないと空のリストを作成することができます。
empty_list = []
print(empty_list)
リストには、様々な型の要素を格納することができます。また、一つのリストの中に異なる型の要素が混在可能です。
# 数値のリスト
nums = [1, 2, 3, 4, 5]
print(nums)
# 文字列のリスト
strs = ['apple', 'バナナ', 'cherry']
print(strs)
# 数値と文字列が混在したリスト
mixed = [1, 'apple', 2, 'バナナ', 3]
print(mixed)
1.1.2. list()関数で作成
list()関数を使ったリスト作成もよく使います。
list(リストに変換したいオブジェクト)
関数の引数にタプルや文字列、セットや辞書などのオブジェクトを渡すと、それをリストに変換します。
nums = list((1, 2, 3, 4, 5)) # タプルをリストに変換
print(nums)
strs = list('abcde') # 文字列をリストに変換
print(strs)
引数に渡すのは変数でも構いません。
tuple = (1, 2, 3, 4, 5)
nums = list(tuple)
print(nums)
1.1.3. range()関数で作成
list()関数とrange()関数を組み合わせると、任意の数値が連続したリストをシンプルに作ることができます。
range()関数の引数には、開始位置と終了位置、ステップの数値をカンマ区切りで渡します。
range(開始位置, 終了位置, ステップ)
実際のコードで確認しましょう。
nums1 = list(range(5))
print(nums1)
nums2 = list(range(-5, 6))
print(nums2)
nums3 = list(range(1, 11, 2))
print(nums3)
range()関数は、次のページでより詳しく解説しています。
また以上の3つのリスト作成方法に関しても、以下のページで、さらに細かく解説していますので、ぜひ一緒にご覧ください。
1.2. リストのスライス
作成したリストの要素はスライスで取り出すことができます。
次のように書きます。
リスト[開始位置:終了位置:ステップ]
開始位置と終了位置はインデックス番号で指定します。ステップは例えば、「2」と書いたら2つ置きに、「3」と書いたら3つ置きに要素を取り出します。それぞれカンマではなく、コロンで区切ります。
次のリストを例に見ていきましょう。
list = ['a', 'b', 'c', 'd', 'e', 'f']
このリストには、次のようにインデックス番号が与えられています。
インデックス番号は前から数える時は0から始まり、後ろから数える時は-1から始まります。
まず、[] の中にインデックス番号を1つだけ書くと、その番号に対応した要素を取り出します。以下のコードでは、インデックス2番の要素を取り出しています。
list[2]
開始位置、終了位置、ステップを組み合わせれば、様々な方法でリストを取り出したり分割したりすることができます。
print(list[3:]) # 開始位置を指定
print(list[:3]) # 終了位置を指定
print(list[2:5]) # 範囲を指定
print(list[::2]) # ステップを指定
print(list[::-1]) # 逆順
print(list[1:4:2]) # 範囲とステップを指定
ポイントとして、スライスの際は開始位置のインデックスは含まれ、終了位置のインデックスは含まれないという点を覚えておきましょう。
以下のページでは、これらについて一つずつ詳しく解説しています。
1.3. リストの要素の置換
Pythonのリストはミュータブルなオブジェクトです。そのため、一度作成したリストの要素の一部を後で変更(置換)することが可能です。
置換にはスライスを使います。
以下のコードでは、インデックス2番を大文字の「C」に置き換えています。
list = ['a', 'b', 'c', 'd', 'e', 'f']
list[2] = 'C'
print(list)
スライスの範囲指定やステップ指定を使うと、複数の要素を一度に置換することができます。
list = ['a', 'b', 'c', 'd', 'e', 'f']
list[3:] = 'D', 'E', 'F'
print(list)
list = ['a', 'b', 'c', 'd', 'e', 'f']
list[::2] = 'A', 'C', 'E'
print(list)
1.4. リストの要素数の取得
リストの要素数を取得したい場合はlen()関数を使います。
len(リスト)
次のように、リストの要素数を返してくれます。
nums = [0, 1, 2, 3, 4]
len(nums)
以下のページでは、多重リストの場合の要素数の取得や、for文を使った一括取得なども解説しています。
2. リストの結合や要素の追加
続いて、リスト同士を結合する方法や、リストに要素を追加する方法をおさえておきましょう。「Pythonのリストに要素を追加,結合/連結する方法まとめ」も、ぜひ参考にしてみてください。
2.1. リストの結合|+, +=, extend()
リストの結合には3つの方法を知っておきましょう。
- +演算子:複数のリストを結合した新しいリストを作成
- +=演算子:左項に右項のリストの要素を追加
- extend()メソッド:引数に入れたリストの要素を追加
まず、+演算子を使うと複数のリストを結合した新しいリストを作ることができます。
次のコードでは、num1とnums2を結合した新しいリストnums3を作っています。
nums1 = [1, 2, 3, 4, 5]
nums2 = [6, 7, 8, 9, 10]
nums3 = nums1 + nums2
print(nums3)
+=演算子は、左項のリストに右項の要素を追加します。新しいリストを作るのではなく左項のリストが変化する点が、+演算子との違いです。
nums1 += nums2
print(nums1)
extend()メソッドも、+=演算子と同じように、あるリストに別のリストの要素を結合するものです。
次のように書きます。
リスト.extend(結合したいリスト)
実際に見てみましょう。
nums1 = [1, 2, 3, 4, 5]
nums2 = [6, 7, 8, 9, 10]
nums1.extend(nums2)
print(nums1)
余談ですが、extend()メソッドは内部では次の処理を行なっています。
nums1 = [1, 2, 3, 4, 5]
nums2 = [6, 7, 8, 9, 10]
nums1[len(nums1):] = nums2
print(nums1)
これを見ると、extend()メソッドよりも+=演算子を使う方がシンプルですし、コンピュータにとっても負担が少ないと考えられます。なお、以下のページではextend()メソッドに関して、さらに詳しく解説しています。
2.2. リストの要素の追加|+=, append(), insert()
リストに要素を追加する方法は、次の3つをおさえておきましょう。
- +=演算子:末尾に要素を追加
- append()メソッド:末尾に要素を追加
- insert()メソッド:任意のインデックスに要素を追加
+=演算子は、リスト同士の結合だけではなく、次のように要素を追加するために使うこともできます。
nums = [0, 1, 2, 3, 4]
nums += 5, 6, 7
print(nums)
文字列のリストでも同様です。
strs = ['あ', 'い', 'う']
strs += 'か', 'き'
print(strs)
append()メソッドも、リストの末尾に新しい要素を追加するために使います。次のように書きます。
リスト.append(追加したい要素)
以下のコードをご覧ください。
nums = [0, 1, 2, 3, 4]
nums.append(5)
print(nums)
ただし、append()メソッドは、+=演算子のように複数の要素を一度に追加することはできません。あくまでも、一つずつ追加したい時に使います。以下のページもあわせてお読みください。
insert()メソッドは、リストの任意の位置に要素を追加する時に使います。
次のように書きます。
リスト.insert(挿入したい位置, 追加する要素)
実際に見てみましょう。
nums = [1, 2, 3, 4, 5]
nums.insert(2, 2.5)
print(nums)
以下のコードは要素が文字列のリストに、新しい文字列要素を追加しています。
strs = ['apple', 'banana', 'durian']
strs.insert(2, 'cherry')
print(strs)
3. リストの要素の削除
リストの要素を削除する方法は、目的に応じて、以下の4つを使い分けられるようになりましょう。
- pop():インデックス番号で削除する要素を指定
- remove():削除する値を直接指定
- clear():要素の全削除
- del文:任意の範囲を指定
これらは「Pythonのリストの要素を削除する方法まとめ」でも詳しく解説しているので、ぜひ一緒にご確認ください。
3.1. インデックスで要素を指定して削除|pop()
pop()メソッドは、任意のインデックスの要素を削除するものです。次のように書きます。
リスト.pop(インデックス番号)
まず、インデックス番号を指定しない場合、末尾の要素を削除します。
nums = [1, 2, 3, 4, 5, 6, 7]
popped = nums.pop() # 引数が空白の場合は末尾の要素を削除
print(nums)
print(f'削除した要素:{popped}')
インデックスを指定すると、そのインデックスの要素を削除します。
nums = [1, 2, 3, 4, 5, 6, 7]
popped = nums.pop(2) # インデックス番号2番の要素を削除
print(nums)
print(f'削除した要素:{popped}')
上の2つのコードで、削除した要素を別の変数に代入している点にも注目しましょう。pop()メソッドは、このように削除した要素を返すので、削除要素に処理を加えたい場合にも便利です。
以下のページで、さらに詳しく解説しているので、ぜひ参考にして頂ければと思います。
3.2. 要素を指定して削除|remove()
remove()メソッドは、引数に直接、削除したい要素を渡します。次のように書きます。
リスト.remove(削除したい要素)
実際に見てみましょう。
nums = [1, 2, 3, 4, 5, 6, 7]
nums.remove(4)
print(nums)
fruits = ['apple', 'banana', 'cherry']
fruits.remove('banana')
print(fruits)
3.3. 要素を全削除(初期化)|clear()
clear()メソッドは要素を全て削除して初期化します。
nums = [1, 2, 3, 4, 5, 6, 7]
nums.clear()
print(nums)
3.4. 範囲を指定して削除|del文
del文は、スライスで削除する要素を指定することができます。次のように書きます。
del リスト[開始位置:終了位置:ステップ]
nums = [1, 2, 3, 4, 5, 6, 7]
del nums[3:] # インデックス番号3番以降を削除
print(nums)
nums = [1, 2, 3, 4, 5, 6, 7]
del nums[1:6:2] # インデックス番号1番から5番を2置きに削除
print(nums)
スライスに関しては「Pythonのリストのスライス」でご確認ください。
4. リストの要素の検索
リストの中に任意の要素が含まれているかを検索するには3つの方法を抑えておきましょう。
- in演算子:任意の要素が存在するかを調べる
- index()メソッド:任意の要素のインデックスを調べる
- count()メソッド:任意の要素の個数を調べる
4.1. 要素が存在するかを調べる|in演算子
次のように書くと、対象のリスト内に任意の要素があるかどうかを、TrueかFalseかのブール値で返してくれます。
検索したい要素 in リスト
実際に見てみましょう。
次のリストには数値の10は存在するのでTrueと返ってきています。
nums = [10, 20, 30, 40, 50]
10 in nums
しかし、文字列の’あ’は存在しないので Falseと返ってきます。
'あ' in nums
4.2. 要素の位置を返す|index()メソッド
index()メソッドは、指定の要素の位置をインデックス番号で返します。次のように書きます。
リスト.index(検索したい値)
以下では、リストの中の20のインデックス番号は1なので、それを返しています。
nums = [10, 20, 30, 40, 50]
nums.index(20)
存在しない要素を検索した場合はエラーになります。
nums.index(60)
4.3. 要素の個数を調べる|count()メソッド
count()メソッドは、リスト内の指定の要素の個数を返します。次のように書きます。
リスト.count(検索したい値)
以下のリストには7は4つありますね。
nums = [1, 1, 2, 3, 3, 3, 4, 5, 6, 7, 7 ,7 ,7]
nums.count(7)
なお、count()メソッドは、存在しない値を検索した場合、エラーにならずに0を返します。
これら3つのメソッドについては、「Pythonのリストを検索する方法まとめ」でさらに詳しく解説しているので、ぜひご確認ください。
5. リストのソート(並び替え)
リストのソートには次の方法があります。
- sort()メソッド:リストの要素をソートする
- sorted()関数:あるリストの要素をソートした新しいリストを作る
- reverse()メソッド:既存のリストの要素を逆順に並び替える
5.1. リストをソートする|sort()メソッド
sort()メソッドは、リストの要素をソートするメソッドです。次のように書きます。
リスト.sort()
なおsort()メソッドのソートの法則は次のようになっています。
- 数値昇順
- アルファベット昇順(大文字小文字が混在する場合は大文字から)
- あいうえお・アイウエオ昇順
- 文字が混在する場合はユニコード順(アルファベット→かな→カナ順)
実際に見てみましょう。以下のコードは数値を昇順でソートしています。
nums = [5, 3, 4, 2, 1]
nums.sort()
print(nums)
文字列も法則の通りにソートされます。
alphas = ['e','b', 'd', 'c', 'a' ]
alphas.sort()
print(alphas)
sort()メソッドは、あくまでも既存のリストの要素をソートするのであって、要素をソートした新しいリストを作るのではない点に注意しましょう。
5.2. リストの要素をソートした新しいリストを作る|sorted()関数
sorted()関数は、あるリストの要素をソートした新しいリストを作ります。
sorted(リスト)
ソートの法則はsort()メソッドと同じです。
nums = [5, 3, 4, 2, 1]
new_nums = sorted(nums)
print(new_nums)
alphas = ['e','b', 'd', 'c', 'a' ]
new_alphas = sorted(alphas)
print(new_alphas)
なお、sort()メソッドやsorted()関数に関して、降順ソートの方法や、別のソート法則にする方法なども含めて、「Pythonのリストの要素をソートする」でさらに詳しく解説していますので、ぜひ確認しておきましょう。
5.3. 逆順に並び替える|reverse()メソッド
reverse()メソッドは、リストの要素を逆順に並び替えます。次のように書きます。
リスト.reverse()
実際に見てみましょう。
nums = [3, 5, 2, 4, 1]
nums.reverse()
print(nums)
reverse()メソッドは、要素が逆順になった新しいリストを作るのではなく、対象のリストの要素を逆順に並び替えます。
もし、要素を逆順にした新しいリストを作りたいなら、逆順スライスで作成します。
nums = [3, 5, 2, 4, 1]
r_nums = nums[::-1]
print(r_nums)
これらは「Pythonのリストを逆順に並び替る方法」で解説しています。
6. for文によるリストの要素の取り出し
for文を使うと、リストの要素を一つずつ順番に取り出すことができます。for文については「Pythonのfor文による繰り返し処理」で解説しているので、ぜひご覧ください。
data = [1, 10, 100, 1000, 10000]
for i in data:
print(i)
これを使うと、例えば以下のコードのように複数リストを組み合わせた処理を行うことができるようになります。
datas = [178, 73, 95, 125, 170]
measures = ['身長', '体重', 'ベンチプレス', 'スクワット', 'デッドリフト']
units = ['cm', 'kg', 'kg', 'kg', 'kg']
for data, measure, unit in zip(datas, measures, units):
print(f'{measure}:{data}{unit}')
なお、このコードのprint()関数の書き方は「f文字列」というものです。「Pythonの文字列の中で変数を展開する方法」で解説しています。
7. リスト内包表記
リスト内包表記は、様々なリストを簡潔なコードで作ることができる「Pythonらしい」書き方です。
次のように書きます。
式 for 変数 in イテラブル
実際のコードを確認してみましょう。
squares = [num**2 for num in range(5)]
print(squares)
式の中にif文やelse節を入れて、より複雑な式を書くこともできます。
list = [1, 'a', 2, 'b', 3, 'c']
cubes = [num**3 for num in list if isinstance(num, int)]
print(cubes)
list = [1, 'a', 2, 'b', 3, 'c']
num_char = ['num' if isinstance(i, int) else 'str' for i in list]
print(num_char)
最初は見慣れないと思いますが、「Pythonのリスト内包表記の書き方」で詳しく解説しているので、それを参考にたくさんコードを描いてみてください。そうすれば、自然と身についていきます。
8. その他の操作
あ
8.1. 最大値・最小値・合計を取得|max(), min(), sum()
リストの要素の最大値や最小値を取得するには、max()関数やmin()関数を使います。
nums = [3, 32, 64, 73,12, 93]
print(max(nums))
print(min(nums))
print(sum(nums))
max()関数とmin()関数に関しては、「Pythonのリストの最大値・最小値を取得する」で、様々なケースを交えて解説しています。
8.2. 平均値を取得
リストの数値の平均値を知りたい場合は、statisticsモジュールのmean()関数を使います。
モジュールについては「Pythonのモジュールについて」で解説しています。
import statistics
nums = [3, 32, 64, 73,12, 93]
mean = statistics.mean(nums)
print(round(mean))
8.3. シャッフル
リストの要素をシャッフルするには、randomモジュールのshuffle()関数とsample()関数があります。
shuffle()関数は、元のリストの要素をシャッフルします。
import random
nums = list(range(5))
random.shuffle(nums)
print(nums)
sample()関数は、要素をシャッフルした新しいリストを作ります。
import random
nums = list(range(5))
r_nums = random.sample(nums, len(nums))
print(r_nums)
これらについては「Pythonでリストをシャッフルする方法」でより詳しく解説しています。
10.まとめ
以上が、リストでよく行う操作です。全て使いこなせるようになれば初心者卒業と言っていいと思います。
コメント