top
おさだのホームページ

あるとちょっと使えるかもしれないPythonのプログラム
思い立ったら追加していく

プログラムは全て関数にしてあるので、使うときは「 関数名(入力) 」とする。


1. 全角文字 → 半角文字 に変換する
hankaku(文字列)

copy
 
hankaku = lambda xs : xs.translate(str.maketrans({chr(0xFF01 + i): chr(0x0021 + i) for i in range(94)}))

実行結果:

hankaku("ABC(>O<)123")
>> "ABC(>O<)123"


2. 半角文字 → 全角文字 に変換する
zenkaku(文字列)

copy
 
zenkaku = lambda xs : xs.translate(str.maketrans({chr(0x0021 + i): chr(0xFF01 + i) for i in range(94)}))

実行結果:

zenkaku("abc(>o<)123")
>> "ABC(>O<)123"


3. リスト内での登場回数をカウントして辞書型にして出力
list_count(リスト)

copy
 
def list_count(xs:list, *, re=dict()):
    for x in xs:
        re[x] = 1 if not x in re else re[x] + 1
    return re

実行結果:

list_count([1, 1, 1, 2, 2, 3])
>> {1:3, 2:2, 3:1}


4. リスト内の空き要素を削除する
bye_none(リスト)

copy
 
bye_none = lambda xs : [x for x in [y for y in xs if y != None] if len(str(x)) != 0]

実行結果:

bye_none(["abc", "", None, 7])
>> ["abc", 7]


5. リスト内の特定の文字を別の文字に置き換える
rep(リスト, 置き換える文字, 置き換えた結果)

copy
 
def rep(xs:list, before="", after="", *, re=[]):
    for x in xs:
        try:
            re += [x.replace(before, after)]
        except:
            re += [x]
    return re

実行結果:

rep(["abcd", "aaabbb"], "a", "b"])
>> ["bbcd", "bbbbbb"]


6. 文字列の中で複数の文字を同時に置き換える
rep_list(文字列, 置き換える文字リスト, 置き換え結果リスト)

copy
 
def rep_list(xs:str, before=[""], after=[""], *, re=""):
    if(len(before) == len(after)):
        for x in xs:
            if(x in before):
                for i in range(len(before)):
                    if(x == before[i]):
                        re += after[i]
            else:
                re += x
    else:
        re = xs
    return re

実行結果:

rep_list("aabbccdd", ["a", "c", "d"], ["c", "a", ""])
>> "ccbbaa"



7. 階乗(n!)を計算する
fac(整数)

copy
 
def fac(n:int, *, fi=1):
    if(n <= fi):
        return fi
    return n*fac(n-1, fi=fi)

実行結果:

fac(5)
>> 120  ( ※ 5! = 120 )


8. 組み合わせ(C)を計算する
aCb = comb(a, b)

copy
 
def comb(a:int, b:int, *, re=1):
    for i in range(b):
        re *= (a-i)/(b-i)
    return re

実行結果:

comb(5, 2)
>> 10.0  ( ※ 5C2 = 10 )


9. 順列(P)を計算する
aPb = perm(a, b)

copy
 
def perm(a:int, b:int, *, re=1):
    for i in range(b):
        re *= (a-i)
    return re

実行結果:

perm(10, 3)
>> 720  ( ※ 10P3 = 720 )


10. 二項定理を計算する
(a+b)^n = bino(a, b, n)

copy
 
def bino(a:int, b:int, n:int, *, re=0, bf=1):
    for k in range(n+1):
        _bf = bf
        for i in range(k):
            _bf *= (n-i)/(k-i)
        re += _bf*(a**k)*(b**(n-k))
    return re

実行結果:

bino(1, 2, 3)
>> 27.0  ( ※ (1+2)^3 = 27 )


11. リストから平均を求める
avg(リスト)

copy
 
avg = lambda ns : sum(ns)/len(ns)

実行結果:

avg([1, 2, 3, 0.5])
>> 1.625


12. リストから分散を求める
div(リスト)

copy
 
def div(ns:list, *, re=0):
    av = sum(ns)/len(ns)
    for n in ns:
        re += abs(av-n)**2
    return re/len(ns)

実行結果:

div([1, 2, 3, 0.5])
>> 0.921875

標準偏差を求めたければこれの平方根を取れば良い


13. リスト内の総乗(全ての掛け算)を計算する
prod(リスト)

copy
 
def prod(ns:list, *, re=1):
    for n in ns:
        re *= n
    return re

実行結果:

prod([1, 2, 3, 0.5])
>> 3.0  ( ※ 1*2*3*0.5 = 3 )


14. ある関数の任意の点における傾きを求める
diff(xの値, 式)

copy
 
def diff(x, f=None, *, d=1e-10, keta=5):
    return None if f == None else (( f(x+d) - f(x) )/d) // 10**(-1*keta) / 10**keta

実行結果:

diff(2, lambda x:x**2)
>> 4.0  ( ※ d/dx(x^2) = 2x; x=2 -> 2x=4 )

または

def f(x):
    return 2*(x**3)
diff(2, f)
>> 24.0  ( ※ d/dx(2x^3) = 6x^2; x=2 -> 6x^2=24 )


15. 10 進数を n 進数に変換する
nary(数値, 底)

copy
 
def nary(num:int, n:int, list:bool=False) -> str:
    buf, result = [], ""
    while num >= 1:
        buf.append(int(num % n))
        num /= n
    for r in buf[::-1]:
        result += chr((48 if r < 10 else (55 if r < 36 else 70)) + r)
    return buf[::-1] if list else result

0~9, A~Z, a~zまでの文字を使用し、2進数から61進数まで対応しています。


実行結果:

nary(4, 2)
>> "100"

nary(2000, 16)
>> "7D0"

また、第3引数にTrueを渡すと文字列ではなくリストが返ってくる。
nary(2000, 16, True)
>>[7, 13, 0]