Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

map(), filter()

pythonのmap(), filter()の使い方について。
 

map()

Definition : map(func, *iterables)
リストなどの全要素に関数を適用し、イテレータを作る。
もとのリストは保存され、非破壊的。
mapオブジェクトを生成するので、中身を見たければlist化など。

list1 = [1.7, 5.9, -3.68]
m = map(int, list1)
print(m)            # <map object at 0x...>
print(list(m))      # [1, 5, -3]

 
mapのかわりに内包表記でも書ける

list1 = [1.7, 5.9, -3.68]
print([int(i) for i in list1])  # [1, 5, -3]

 
mapオブジェクトはイテレータ

list1 = [1.7, 5.9, -3.68]
m = map(int, list1)
print(next(m))     #  1 
print(next(m))     #  5
print(next(m))     # -3

 
lambda関数も使える

m = map(lambda x:x**2, range(4))
print(list(m))        # [0, 1, 4, 9]

 
map()を使って相関係数を計算する
公式:
f:id:rare_Remrin:20170505165448p:plain

# correlation coefficient
def corr(x, y):
    if len(x) != len(y):
        return "different length"
    sx = sum(x)
    sy = sum(y)
    sx2 = sum(map(lambda x:x**2, x))
    sy2 = sum(map(lambda x:x**2, y))
    sxy = sum(map((lambda x, y:x*y), x, y))
    n = len(x)
    try:
        return (n*sxy-sx*sy)/((n*sx2-sx**2)*(n*sy2-sy**2))**0.5
    except:
        return 0
    
x = [1, 2, 3]
y = [5, 5, 6]
print("相関係数:", corr(x, y)) # 相関係数: 0.8660254037844387

 

filter()

Definition : filter(function or None, iterable)
リストなどの全要素に関数を適用し、Trueのものだけのイテレータを作る。
もとのリストは保存され、非破壊的。
filterオブジェクトを生成するので、中身を見たければlist化など。
 
正の要素だけ選ぶ

list1 = [1.7, 5.9, -3.68]
f = filter(lambda x:x>0, list1)
print(list(f))   # [1.7, 5.9]

 
内包表記でも書ける

list1 = [1.7, 5.9, -3.68]
f = filter(lambda x:x>0, list1)
print(list(f))   # [1.7, 5.9]

 
関数をNoneにすると、Trueのものだけを選ぶ。

f = filter(None, range(4))
print(f)        # <filter object at 0x...>
print(list(f))  # [1, 2, 3]

 
filter()とは逆に偽の要素を選ぶ関数としてitertools.filterfalse()がある。