こんばんは。今日は雨が降り外が涼しいです。そろそろ東京にも梅雨入りの季節が近づいてきたでしょうか。2020年の夏も間近です。
====================================
本記事では、私が良く使うPythonの簡単で便利な9個のテクニックをご紹介します。基礎的な内容ですが、その分使う場面も多く簡単に導入できると思うのでお勧めです。
- 1. 内包表記
- 2. 内包辞書
- 3. lambda式を使った配列の修正
- 4. 配列の重複削除
- 5. 辞書の値や2重リストのソート
- 6. 可変長引数
- 7. 引数のアンパック
- 8. 名前付きタプル(named tuple)
- 9. 辞書の初期型
1. 内包表記
forループの記述を簡単にしてリストを作成できます。毎日のように使うテクニックです。if文との併用で利便性が増します。しかし使い過ぎると読みづらいコードになるので注意が必要です。
lst = [i for i in range(10) if i%2 == 0] print(lst) #[0, 2, 4, 6, 8]
上記のコードと等価な冗長な表現はこうなります。
lst = [] for i in range(10): if i%2 == 0: lst.append(i) print(lst) #[0, 2, 4, 6, 8]
2. 内包辞書
内包表記は辞書の作成にも適用できます。ここでは、0からの通し番号をキー、リストの値をバリューとしています。
lst = ["alpha", "beta", "gamma"] dct = {i:j for i, j in enumerate(lst)} print(dct) #{0: 'alpha', 1: 'beta', 2: 'gamma'}
3. lambda式を使った配列の修正
lambda式を使うことで、配列の要素に適当な演算を掛けるなどの修正を施すことができます。ここで肝となるのはmap関数です。第一引数に関数、第二引数に配列を渡すことで、各要素に関数処理を施すことができます。戻り値はイテレータなので、forループで取り出したりlistでリスト化したりします。
lst = [0, 2, 4, 6, 8] #要素を二乗する lst_re = list(map(lambda x:x**2, lst)) print(lst_re) #[0, 4, 16, 36, 64]
4. 配列の重複削除
配列にset型を掛けることによって集合に変換し、重複を除いたユニークな値のみを取り出すことができます。基本の基ですが、なかなか集合を扱う機会がないのでsetの扱いにはいつまでたっても不慣れです。
lst = [1, 1, 2, 2, 3, 4, 5] print(set(lst)) #{1, 2, 3, 4, 5}
5. 辞書の値や2重リストのソート
辞書のキーでなくバリュー(値)でソートしたり、2重リスト(リスト内リスト)の任意の要素でソートしたい場面にはたまに出くわします。そういう場合には、sort関数やsorted関数のkey引数を利用するのが良いです。
dct = {"c":4, "b":1, "f":5} s = sorted(dct.items(), key = lambda x:x[1]) print(s) #辞書のバリューについて昇順にソート #[('b', 1), ('c', 4), ('f', 5)] dlist = [[1, 5], [5, 2], [10, 6]] s = sorted(dlist, key = lambda x:x[1]) print(s) #リスト内リストの第一要素について昇順にソート #[[5, 2], [1, 5], [10, 6]]
6. 可変長引数
関数の引数には決まった数だけでなく、任意の個数を与えることができます。*args, **kwargsといった謎の記号を見たことはありませんか?これが可変長引数の目印です。
def test(*args, **kwargs): if args: print("args:", args) if kwargs: print("kwargs:", kwargs) test("alpha", "beta", "gamma", key1 = "hoge", key2 = "moge") #args: ('alpha', 'beta', 'gamma') #kwargs: {'key1': 'hoge', 'key2': 'moge'}
7. 引数のアンパック
可変長引数に似ていますが、関数の引数の要素が多いと、1つずつ入れていくのが面倒臭いですよね。これを、リストなどの形式でまとめて入れられるようにしたのが引数のアンパックです。例えばリスト型lstにアスタリスクを付けて*lstなどとすると、その要素を引数としてまとめて渡すことができます。
def test(x, y, z): print(x, y, z) args = ["alpha", "beta", "gamma"] test(*args) #alpha beta gamma
8. 名前付きタプル(named tuple)
タプルを使うと、整数のインデックスによって紐づけられたオブジェクトを参照することができます。これを整数でなく適当な文字によって呼び出し可能にするのが名前付きタプル(named tuple)です。名前付きタプルを使うとデータをより分かりやすく(構造化して)整理することができます。
from collections import namedtuple Dog = namedtuple('Animal', ['type', 'color']) d = Dog("Akita", "brown") print(d.type, d.color) #Akita brown
クラスみたいな呼び出し方ですよね。実際これは以下のように冗長に書くこともできます。
class Dog: def __init__(self, type, color): self.type = type self.color = color d = Dog("Akita", "brown") print(d.type, d.color) #Akita brown
9. 辞書の初期型
普通、辞書を使うときに定義されていないキーを使って参照するとエラーが返ってきます。defaultdictを使うと、定義されていないキーを使った場合デフォルトで指定した型が返ってきます。辞書型オブジェクトに何らかの処理を施したいとき、if文なので分岐させずとも一括で処理が可能になるので便利なツールです。もしくはgetメソッドなどを使うのも頻出かもしれません。
from collections import defaultdict d = defaultdict(list) print(d["a"]) #[]
以上、すぐ使えるPythonの便利テクニックでした。基本的な内容ですが、これを使いこなせれば既に人並み以上のパイソニスタと言えるのではないでしょうか。私もまだまだ精進したいです!