TL;DR
人のコードを見ていて、かっこいいなと思ったものをまとめていこうと思います。
かっこいい、かっこ悪いの感じ方には個人差があります。
順次更新 190512
zipを使って2つのリストを一気にfor loopを回す
普段は
a = [1, 2, 3, 4, 5]
b = [11, 12, 13, 14, 15]
上のようなリストのそれぞれ対応している部分をループさせるときにはindexを指定してやってたんですが、zipを使うと同時に回せることを知りました。
#かっこよくないやつ
for i in range(len(a)):
print(a[i], b[i])
#かっこいいやつ
for x, y in zip(a, b):
print(x, y)
enumurateを使ってリストとindexを同時に回す
毎回cnt=0を定義してcntを更新するという愚行を繰り返してたんですがenumurateを知ってから非常にいい感じにかけるようになりました。
#かっこよくないやつ
cnt=0
for x in a:
cnt+=1
print(cnt, x)
#かっこいいやつ
for i, x in enumerate(a):
print(i, x)
全探索するときにitertools.productを使う
a, bの要素を全探索する際にnestを使って二重ループをすると思います。
しかしitertools.productを使うとイテレーターを使って全探索してくれるので綺麗にかけることを最近知りました。
#かっこよくないやつ
for x in a:
for y in b:
print(x, y)
#かっこいいやつ
import itertools
for x, y in itertools.product(a,b):
print(x,y)
numpyアレイの全要素に順番にアクセス
shape
でアレイの形とってきて、それを使って全探索とかしてましたがこれもnumpy.nditer
を使えばシンプルにかけるようです。書いてて思ったけどめちゃくちゃシンプルになってるかと言われるとわからない。でもかっこいいので。
import numpy as np
arr=np.random.randn(3,3)
print(arr)
column, row=arr.shape
for i in range(column):
for j in range(row):
print("("+str(i)+","+str(j)+")")
print(arr[i,j])
nditer = np.nditer(arr, flags=['multi_index'])
while not nditer.finished:
print(nditer.multi_index)
print(arr[nditer.multi_index])
nditer.iternext()
カレントディレクトリの特定拡張子のファイルリストの取得
osモジュールを使えばできるんですが、globモジュールを使うとシンプルです。.jpg
ファイルを取得してみます。
import os
import glob
#かっこよくないやつ
jpgs = [file for file in os.listdir('.') if file.endswith('.jpg')]
#かっこいいやつ
jpgs = glob.glob('*.jpg')
再帰的にディレクトリ内のファイルを取得
os.walkを使ってぐちゃぐちゃやってましたが、これもglob使えばできるらしく
glob
はすごい!
glob.glob("path/**", recursive=True)
tqdmを使ってプログレスバーを表示する
長いループ回してる時にこれ終わるのか?みたいなことがありますよね。そこでtqdmを使えば簡単にプログレスバーを出すことができます。使い方はiteratorの前にtqdm.tqdmで囲むだけ。
import tqdm
for i in tqdm.tqdm(range(10000)):
pass
こんな感じのプログレスバーが簡単に書けます。
100%|██████████| 10000/10000 [00:00<00:00, 1360197.17it/s]
matplotlibの日本語化
基本的にmatplotlibは日本語を認識しません。よくある日本語化手法としては、フォントをいじったりとかが挙げられますが、1行で日本語化できることを知りました。
import japanize_matplotlib
あ、pip install japanize_matplotlib
は必要なので、厳密には最初だけ2行ですね。