のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Pythonで書ける便利な書き方を紹介します。

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

今日はPythonにおける便利記法を書いてみます。
他の言語しか使ったこと無い人もぜひ

※1/25間違いかと思われる箇所の加筆修正を実施

リストに関するイテレーション

enumerate(インデックスとオブジェクトのループ)

enumerateはiterate回数とオブジェクトを同時にループの記載をすることができます。
要素のi番目を取得してループを書くと以下の記載方法になります。

list = [1,2,3,4,5,6]

for i in xrange(len(list)):
    print i,list[i] 

enumerate関数を使うとより、直感的に記載することができます。

for i,number in enumerate(list):
    print i,number

zip(同時に2つのオブジェクトでループ)

zipを使用して固めて、2つ以上の配列をiterationする。
一つだけでなく、セットで固めることができます。

list,list2 = [1,2,3,4],[3,4,5,6]
for i in xrange(len(list)):
    print list[i],list2[i]

これをzipを使って書くと次のようになります。

list,list2 = [1,2,3,4],[3,4,5,6]
for num1,num2 in zip(list,list2):
    print num1,num2

因みにzipとenumerateを組み合わせ、何番目かつ、zipにより固めることができます。

list,list2 = [1,2,3,4],[3,4,5,6]
for index,(num1,num2) in enumerate(zip(list,list2)):
    print index,num1,num2

yield(途中で一旦返す)

yield記法は個人的にバッチ学習の時に使うことが多いです。
直感的にわかりにくいのですが、yieldの時に一回値を返すといったことをします。

def iteration_list(list,batch=2):
    for i in xrange(0,len(list),batch):
         yield list[i:i+batch]

for obj in iteration_list():
    print obj #list[i:i+batch]が表示される。

for-else(forで途中で停止しない場合の条件)

私もこれを作成している時に初めて知ったのですが、
forにelse文をつけることで、breakされなかった時の処理を記述することができます。

for i in xrange(10):
    if i == 100:
        break
else:
    print i #実行される

リスト内包表記

リストの内部にfor文を書き、短く書くことができます。
次に記載するのは0~9までの数字を持ったリストです。

print [i for i in xrange(10)]

また、条件式を使い特定の値を取得することができます。
通常のリストを構築し、appendを実施するより高速に動作するので、単純な処理であればこちらを記述してみましょう。

print [i for i in xrange(10) if i == 2]

Collections

Counter

import collections

counter_list = ["a","b","c","d","e","a","a"]
counter = collections.Counter(counter_list)
print counter
print counter["a"]

default dict(辞書のデフォルト値設定)

一言で説明すると辞書に存在しないキーの初期値を決めることができます。
通常であれば、以下の記述をすることになると思います。

dict = {}
if "a" in dict:
    dict["a"] += 1
else:
    dict["a"] = 0

しかし、collectionsを使うことで簡単に記述ができます。

import collections
dict = collections.defaultdict(int)
dict["a"] += 1

print dict

Sort(ソート)

sorted

sortedを使うと、色々なオブジェクトをソートすることができます。
昇順、降順は

list = [1,4,3,6,5,8]
print sorted(list)
print sorted(list,reverse=True)

出力

[1, 3, 4, 5, 6, 8]
[8, 6, 5, 4, 3, 1]

辞書をソートするコードは以下になります。

dict = {"a":1,"b":2,"c":1}
print sorted(dict.items(),key=lambda x:x[1],reverse=True)
[('b', 2), ('a', 1), ('c', 1)]

因みにソートしたいキーをkeyに選択すれば良いので、基本的にどんな
オブジェクトでもソートすることができます。

if文の書き方

Pythonでif文の条件は連結して書くことができます。
どういうことかといいますと、以下の例を見てみます。
これは、変数aが10より高い、かつ、100未満の時のプログラムにおける一般的な記載方法です。

a = 70
if a > 10 and a < 100:
    print "True"
else:
    print "False"

しかし、Pythonでは、以下のように条件を連結して書くことができます。

if 100 > a > 10:
    print "True"
else:
    print "False"

Fileに関する処理(with)

fileに関する処理は通常以下のように書き、自分の手でクローズしなければなりません。

f = open("test.txt")
#何らかの処理
f.close()

しかし、with statementの導入により、自分でクローズをする必要がなくなります。

with open("test.txt") as f
    print f.read()
    #何らかの処理

in(オブジェクトに存在しているかどうか)

文字列やリストに存在しているかどうか、調べるにはどうすればよいでしょう?
自分で書くには、以下のように書かなければなりません。

searched_number = 4
for i in [1,2,3,4,5,6]:
    if i == searched_number:
        print "find!"
        break

しかし、Pythonにはinと呼ばれるステートメントがあり、以下のように記載することができます。

searched_number = 4
if searched_number in list:
    print "find!"

関数について

返り値を複数返す。

実はPythonは返り値を複数返すことができます。

def return_function(a,b):
    return a,b

関数のオブジェクト化

関数はオブジェクトにすることができます。
条件分岐とかでどの関数を実行するかを選択する場合に主に利用しています。

def sum(a,b):
    return a + b

def diff(a,b):
    return a - b

func_obj = sum
print func_obj(1,2)