牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

ある範囲の連続した数字で1の位が特定の数の場合は省いてみる

追加:『下一桁は10で割った余り』
追加:map使った方が速いかもということで


例えば、90から110の範囲で一の位が「4」と「9」の場合は省く。

#!/usr/bin/env python
# *-# -*- coding: utf-8 -*-

def f(s, e):
    return "\n".join([str(i)
                      for i in range(s, e + 1)
                      if not str(i)[-1] in ["4","9"]])

print f(90,110)

実行結果

90
91
92
93
95
96
97
98
100
101
102
103
105
106
107
108
110

もっとスマートな方法あった気がする?(´・ω・`)

『下一桁は10で割った余り』

twitterで教えて頂きました。あざーす。

>>> 99 % 10
9
>>> 101 % 10
1
>>> for i in range(100, 111):
...     print i % 10
... 
0
1
2
3
4
5
6
7
8
9
0

んで

def f(s, e):
    return "\n".join([str(i) for i in range(s, e + 1)
                      if not i % 10 in [4, 9]])

print f(90,110)

こう?

map使った方が速いかもということで

実験というか計測してみた

#!/usr/bin/env python
# *-# -*- coding: utf-8 -*-

import timeit

t1 = timeit.Timer(stmt="""
def f(s, e):
    return [str(i) for i in range(s, e + 1) if not str(i)[-1] in ['4', '9']]
f(99, 1200)
""")
print t1.timeit(number = 1000)

t2 = timeit.Timer(stmt="""
def f(s, e):
    return [str(i) for i in range(s, e + 1)  if not i % 10 in [4, 9]]
f(99, 1200)
""")
print t2.timeit(number = 1000)

t3 = timeit.Timer(stmt="""
def f(s, e):
    return map(str, [i for i in range(s, e + 1)  if not i % 10 in [4, 9]])
f(99, 1200)
""")
print t3.timeit(number = 1000)

実行結果

4.62032008171
2.56785511971
2.16774392128

mapのが速い
んで

def f(s, e):
    return "\n".join(map(str, [i for i in range(s, e + 1)
                      if not i % 10 in [4, 9]]))

こうかな?