timeモジュール

日付、時刻を処理するtimeモジュールを利用するには、抑えておくべきものが二つある。

  • 1970年1月1日0時0分0秒からの経過秒数を表すエポック秒
  • timeモジュールでの時刻の表現といえる time.struct_timeシーケンス

timeモジュールの関数ではこの二つをよく使う。

gmtime

エポック秒からUTCにおけるtime.struct_timeシーケンスを得る。

>>> time.gmtime(1000000000)
time.struct_time(tm_year=2001, tm_mon=9, tm_mday=9, tm_hour=1, tm_min=46, tm_sec
=40, tm_wday=6, tm_yday=252, tm_isdst=0)

localtime

エポック秒からローカルな時刻のtime.struct_timeシーケンスを得る。

>>> time.localtime(1000000000)
time.struct_time(tm_year=2001, tm_mon=9, tm_mday=9, tm_hour=10, tm_min=46, tm_se
c=40, tm_wday=6, tm_yday=252, tm_isdst=0)

ctime

エポック秒から日付・時刻を表す文字列を得る。

>>> time.ctime(1000000000)
'Sun Sep 09 10:46:40 2001'

ちなみに、gmtime、localtime、ctimeともエポック秒を省略すると現在の時刻が使われる。

asctime

ctimeと違って、time.struct_timeシーケンスから文字列を得る。

>>> time.asctime(time.localtime())
'Sat Feb 16 20:30:02 2013'

time

UTCにおける現在のエポック秒を得る。返り値は浮動小数点数。

>>> time.time()
1361015278.904

mktime

localtimeの逆を行う関数。ローカル時刻のtime.struct_timeシーケンスからエポック秒を得る。

>>> t = time.localtime()
>>> time.mktime(t)
1361014493.0

strftime

time.struct_timeシーケンスから、指定したフォーマットの文字列を得る。

>>> t = time.localtime()
>>> time.strftime("%Y-%m-%d %H:%M:%S", t)
'2013-02-16 20:37:57'

strptime

strftimeの逆。フォーマットされた日付・時刻からtime.struct_timeシーケンスを得る。

>>> s = "2013-02-16 20:40:00"
>>> t = time.strptime(s, "%Y-%m-%d %H:%M:%S")
>>> t
time.struct_time(tm_year=2013, tm_mon=2, tm_mday=16, tm_hour=20, tm_min=40, tm_s
ec=0, tm_wday=5, tm_yday=47, tm_isdst=-1)

主な関数はこんなところ。マニュアルにはほかにもいくつもの関数が書かれている。

cf. http://docs.python.jp/2.7/library/time.html

マージソート

import random

def merge_sort(lis):
    l = len(lis)
    if l <= 1:
        return lis
    else:
        h = l/2
        lis1 = lis[0:h]
        lis2 = lis[h:l]
        return merge(merge_sort(lis1), merge_sort(lis2))

def merge(lis1, lis2):
    merged = []
    while True:
        if len(lis1) == 0:
            merged += lis2
            break
        elif len(lis2) == 0:
            merged += lis1
            break
        else:
            if lis1[0] <= lis2[0]:
                merged.append(lis1.pop(0))
            else:
                merged.append(lis2.pop(0))
    return merged


l = range(1,10) * 2
random.shuffle(l)
print "unsorted:", l
l2 = merge_sort(l)
print "sorted: ", l2    

実行例:

^o^ > python merge_sort.py
unsorted: [6, 9, 6, 3, 4, 1, 4, 5, 3, 1, 2, 8, 7, 2, 5, 7, 9, 8]
sorted:   [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]