zip、map、lambda(ラムダ式)

今回は少し難度高めのものを紹介します。

発展・応用として試してみてください!

zip()

zip関数は、forループで複数のリストの要素を取得してタプルの形式でまとめてくれます。

  • 要素数が異なる場合の処理 :下記のxとyのリストの要素数が異なります。この場合は少ない方に合わせて出力されます(多い分の要素が無視される)。
x = [1, 2, 3]
y = ['a', 'b', 'c', 'd']
for t in zip(x, y):
    print(t)  # タプルにまとめて取り出す

# 実行結果 ---
# (1, 'a')
# (2, 'b')
# (3, 'c')
x = [1, 2, 3]
y = ['a', 'b', 'c', 'd']
for n, s in zip(x, y):  # nとsに各要素を同時に取り出し
    print(n)
    print(s)

# 実行結果 ---
# 1
# a
# 2
# b
# 3
# c
x = [1, 2, 3]
y = [4, 5, 6, 8]
[i + j for i, j in zip(x, y)]  # リスト内容表記でzipを使う

# 実行結果 ---
# [5, 7, 9]

map()

map関数は、イテラルなオブジェクトのすべての要素に同じ演算を適用する関数です。第1引数に関数名(またはlambda式)、第2引数にイテラブルなオブジェクトを指定します。

文字列型の数字が入ったリストをmap関数に渡すint関数でint型に変換して表示する例です。

str_nums = ['1', '2', '3', '4', '5']  # 要素はすべて文字列型

for elem in map(int, str_nums):
    print(elem, type(elem))

# 実行結果 ---
# 1 <class 'int'>
# 2 <class 'int'>
# 3 <class 'int'>
# 4 <class 'int'>
# 5 <class 'int'>

独自の関数を定義して使ってみます。

str_nums = ['1', '2', '3', '4', '5']

def add(n):  # 独自関数
    return 'No.' + str(n)  # 文字列の「No.」を追加

for elem in map(add, str_nums):
    print(elem)

# 実行結果 ---
# No.1
# No.2
# No.3
# No.4
# No.5

lambda ラムダ式

ラムダ式(lambda式)は無名関数とも呼ばれます。名前を持たない使い捨て関数です。関数を引数にとる関数など(map関数など)と併用します。

lambda 引数: 返り値

# lambda 引数: 引数 ** 2
my_lambda = lambda x: x ** 2
my_lambda(10)  # 10の2乗の結果が返ってきます

# 実行結果 ---
# 100

map関数の例のところでやった独自関数(add)を使った例を、lambda式で置き換えてみます。

str_nums = ['1', '2', '3', '4', '5']

for elem in map(lambda n: 'No.' + str(n), str_nums):
    print(elem)

# 実行結果 ---
# No.1
# No.2
# No.3
# No.4
# No.5