Pythonには、プログラミングを効率的かつ快適にするための「組み込み関数」が数多く用意されています。これらを使いこなせるかどうかで、コードの質は大きく変わります。
今回はその中でも、特にデータ操作の基本となる5つの重要な組み込み関数、sorted(), len(), all(), any(), slice() に焦点を当て、初心者の方にも理解できるよう、使い方を徹底的に解説していきます。
この記事を読み終える頃には、これらの関数への迷いがなくなり、自信を持って使えるようになっているはずです。
はじめに:Pythonのデータ操作を加速させる基本の組み込み関数
この記事でわかること
sorted(): データを思い通りに並び替える方法len(): データのかたまりの「大きさ」を知る方法all(),any(): 複数の条件を一度にチェックする方法slice(): データの一部をスマートに切り出す方法
これらの関数は、Pythonをインストールすればすぐに使える、いわば標準装備の万能ツールです。一つずつ確実にマスターしていきましょう。
sorted()関数:リストや辞書を自在に並び替える
sorted()は、リストなどのイテラブル(繰り返し可能なオブジェクト)を受け取り、並び替えた新しいリストを返す関数です。元のリストは変更されないのが重要なポイントです。
基本的な使い方 – sorted(iterable)
数値や文字列のリストを渡すだけで、簡単に昇順(小さい順、アルファベット順)にソートできます。
numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers)
print(f"元のリスト: {numbers}")
print(f"ソート後のリスト: {sorted_numbers}")
# 出力:
# 元のリスト: [3, 1, 4, 1, 5, 9, 2]
# ソート後のリスト: [1, 1, 2, 3, 4, 5, 9]reverse=Trueで降順(大きい順)にソートする
引数に reverse=True を加えることで、降順(大きいものから小さいものへ)に並び替えることができます。
numbers = [3, 1, 4, 1, 5, 9, 2]
desc_numbers = sorted(numbers, reverse=True)
print(f"降順ソート: {desc_numbers}")
# 出力: 降順ソート: [9, 5, 4, 3, 2, 1, 1][応用] key引数で複雑なデータもソートする
key引数を使うと、より複雑な条件でソートできます。例えば、辞書のリストを特定の値(例:年齢)でソートしたい場合に威力を発揮します。
users = [
{'name': 'Suzuki', 'age': 32},
{'name': 'Sato', 'age': 25},
{'name': 'Takahashi', 'age': 28},
]
# 'age'を基準にソートする
sorted_by_age = sorted(users, key=lambda u: u['age'])
print(sorted_by_age)
# 出力: [{'name': 'Sato', 'age': 25}, {'name': 'Takahashi', 'age': 28}, {'name': 'Suzuki', 'age': 32}]リストのsort()メソッドとの違いは?
sorted()関数は新しいリストを返すのに対し、リストのsort()メソッドは元のリスト自体を直接書き換えます。元のデータを残しておきたい場合はsorted()、不要な場合はsort()と使い分けるのが一般的です。
len()関数:リストや文字列の「長さ」を一瞬で取得
len()は、オブジェクトに含まれる要素の数や文字数(=長さ)を返す、非常にシンプルでよく使われる関数です。
基本的な使い方 – len(object)
引数に長さを知りたいオブジェクトを渡すだけです。
my_list = [10, 20, 30, 40]
print(f"リストの要素数: {len(my_list)}") # 出力: リストの要素数: 4
my_string = "Hello, Python!"
print(f"文字列の文字数: {len(my_string)}") # 出力: 文字列の文字数: 14様々なオブジェクトに使える汎用性
len()はリストや文字列だけでなく、タプル、辞書、集合(セット)など、大きさの概念を持つ多くのオブジェクトに対して使用できます。
my_dict = {'a': 1, 'b': 2}
print(f"辞書のキーの数: {len(my_dict)}") # 出力: 辞書のキーの数: 2all()とany()関数:すべての要素?それとも一つでも?
all()とany()は、リストなどの要素をまとめて評価し、条件が満たされているかをTrueかFalseで返す関数です。
all(): すべての要素がTrueならTrue
all()は、渡されたイテラブルの**すべての要素がTrue(またはTrueと見なせる値)**である場合にのみTrueを返します。一つでもFalseがあればFalseを返します。
# 全て0より大きいか? -> True
list1 = [1, 5, 10]
print(all(n > 0 for n in list1)) # 出力: True
# 全て0より大きいか? -> False (0が含まれる)
list2 = [1, 0, 10]
print(all(n > 0 for n in list2)) # 出力: Falseany(): いずれかの要素がTrueならTrue
any()は、渡されたイテラブルのいずれか一つでも要素がTrueであればTrueを返します。すべての要素がFalseの場合にのみFalseを返します。
# 奇数が含まれるか? -> True
list3 = [2, 4, 5, 6, 8]
print(any(n % 2 != 0 for n in list3)) # 出力: True
# 奇数が含まれるか? -> False
list4 = [2, 4, 6, 8]
print(any(n % 2 != 0 for n in list4)) # 出力: False空のリストを渡したときの注意点
少し特殊なケースですが、空のリストを渡すと次の結果になります。
all([])はTrueを返します。(偽となる要素が一つもないため)any([])はFalseを返します。(真となる要素が一つもないため)
slice()オブジェクト:シーケンスの一部をスマートに切り取る
slice()は、スライス(部分的な切り出し)を行うための「スライスオブジェクト」を作成する関数です。
基本的な使い方 – slice(stop) / slice(start, stop, step)
slice(5)は[0:5]、slice(1, 5, 2)は[1:5:2]のスライスと同じ意味になります。
my_list = [0, 10, 20, 30, 40, 50, 60]
s = slice(1, 5) # [1:5] と同じスライスオブジェクトを作成
print(my_list[s])
# 出力: [10, 20, 30, 40]一般的なスライス表記 [start:stop:step] との関係
通常、リストの一部を切り出すにはmy_list[1:5]のようなスライス表記を使います。実はこの表記は、内部的にslice()オブジェクトを使っています。
では、なぜslice()関数が用意されているのでしょうか? それは、同じスライスを何度も使いたい場合に便利だからです。スライスに名前をつけて再利用することで、コードが読みやすくなります。
# 例えば、データのヘッダー部分とボディ部分を切り出すスライスを定義しておく
HEADER = slice(0, 1)
BODY = slice(1, None) # 1番目から最後まで
data = ['ヘッダー情報', 'データ1', 'データ2', 'データ3']
print(data[HEADER]) # 出力: ['ヘッダー情報']
print(data[BODY]) # 出力: ['データ1', 'データ2', 'データ3']このように、特定の意味を持つスライスに名前を付けておくことで、コードの可読性が向上します。
まとめ:基本の関数を制して、コーディングを効率化しよう
今回は、Pythonのデータ操作に欠かせない5つの組み込み関数を解説しました。
sorted(): 新しいソート済みリストを返す。keyやreverseで高度な並び替えも可能。len(): オブジェクトの要素数を返す、シンプルで万能な関数。all(): すべての要素が真ならTrue。any(): 一つでも要素が真ならTrue。slice(): スライス処理に名前を付けて再利用できる。
これらの基本的な関数を使いこなすことは、効率的で読みやすいコードを書くための第一歩です。ぜひ実際のコーディングで積極的に活用してみてください。


コメント