目次
リスト同士の四則演算
前回、Pythonでリスト内の全ての数値に対して同じ値で足し算、引き算、掛け算、割り算する方法を紹介しました。
【Python基礎】リスト内の全ての数値に対して同じ値で足し算、引き算、掛け算、割り算する方法
リスト内の要素への四則演算 前回、PythonのmatplotlibでX軸を上に、Y軸を右に表示する方法を紹介しました。 今回はリスト内の全ての数値に対して同じ値で足し算、引き…
今回は二つのリストで同じインデックスの要素を足し算、引き算、掛け算、割り算する方法を紹介します。
それでは始めていきましょう。
正しく計算できない例
まずは正しく計算できない例です。
とりあえず数値のリストを二つ作成し、その二つのリスト同士で計算してみます。
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
print(a+b)
実行結果
[1, 2, 3, 4, 5, 2, 4, 6, 8, 10]
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
print(a-b)
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[1], line 4
1 a = [1, 2, 3, 4, 5]
2 b = [2, 4, 6, 8, 10]
----> 4 print(a-b)
TypeError: unsupported operand type(s) for -: 'list' and 'list'
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
print(a*b)
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[2], line 4
1 a = [1, 2, 3, 4, 5]
2 b = [2, 4, 6, 8, 10]
----> 4 print(a*b)
TypeError: can't multiply sequence by non-int of type 'list'
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
print(a/b)
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[3], line 4
1 a = [1, 2, 3, 4, 5]
2 b = [2, 4, 6, 8, 10]
----> 4 print(a/b)
TypeError: unsupported operand type(s) for /: 'list' and 'list'
足し算だけは計算できましたが、それでもリストが連結されただけで、同じインデックスの要素同士を足し算はしてくれませんでした。
numpyを使う方法
二つのリストで同じインデックスの要素同士を計算するには、numpyのアレイにしてしまうと楽です。
import numpy as np
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
print(np.array(a)+np.array(b))
print(np.array(a)-np.array(b))
print(np.array(a)*np.array(b))
print(np.array(a)/np.array(b))
実行結果
[ 3 6 9 12 15]
[-1 -2 -3 -4 -5]
[ 2 8 18 32 50]
[0.5 0.5 0.5 0.5 0.5]
ただし二つのリストが同じ要素数でない場合はエラーとなるので注意です。
import numpy as np
a = [1, 2, 3, 4, 5, 6]
b = [2, 4, 6, 8, 10]
print(np.array(a)+np.array(b))
実行結果
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[7], line 6
3 a = [1, 2, 3, 4, 5, 6]
4 b = [2, 4, 6, 8, 10]
----> 6 print(np.array(a)+np.array(b))
ValueError: operands could not be broadcast together with shapes (6,) (5,)
for文を使う方法
for文とzip関数を使い、同じインデックスの要素を取り出し計算する方法です。
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
c = []
for a_val, b_val in zip(a, b):
c.append(a_val + b_val)
d = []
for a_val, b_val in zip(a, b):
d.append(a_val - b_val)
e = []
for a_val, b_val in zip(a, b):
e.append(a_val * b_val)
f = []
for a_val, b_val in zip(a, b):
f.append(a_val / b_val)
print(c)
print(d)
print(e)
print(f)
実行結果
[3, 6, 9, 12, 15]
[-1, -2, -3, -4, -5]
[2, 8, 18, 32, 50]
[0.5, 0.5, 0.5, 0.5, 0.5]
この場合、二つのリスト内の要素数が異なっていても、自動で短い方に合わせてくれます。
a = [1, 2, 3, 4, 5, 6]
b = [2, 4, 6, 8, 10]
c = []
for a_val, b_val in zip(a, b):
c.append(a_val + b_val)
d = []
for a_val, b_val in zip(a, b):
d.append(a_val - b_val)
e = []
for a_val, b_val in zip(a, b):
e.append(a_val * b_val)
f = []
for a_val, b_val in zip(a, b):
f.append(a_val / b_val)
print(c)
print(d)
print(e)
print(f)
実行結果
[3, 6, 9, 12, 15]
[-1, -2, -3, -4, -5]
[2, 8, 18, 32, 50]
[0.5, 0.5, 0.5, 0.5, 0.5]
リスト内包表記を使う方法
for文で簡単に書けたので、リスト内包表記でも書くことができます。
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
c = [a_val + b_val for a_val, b_val in zip(a, b)]
d = [a_val - b_val for a_val, b_val in zip(a, b)]
e = [a_val * b_val for a_val, b_val in zip(a, b)]
f = [a_val / b_val for a_val, b_val in zip(a, b)]
print(c)
print(d)
print(e)
print(f)
実行結果
[3, 6, 9, 12, 15]
[-1, -2, -3, -4, -5]
[2, 8, 18, 32, 50]
[0.5, 0.5, 0.5, 0.5, 0.5]
for文を利用した場合と同様にリストの要素数が異なっていても、短い方に合わせてくれます。
a = [1, 2, 3, 4, 5, 6]
b = [2, 4, 6, 8, 10]
c = [a_val + b_val for a_val, b_val in zip(a, b)]
d = [a_val - b_val for a_val, b_val in zip(a, b)]
e = [a_val * b_val for a_val, b_val in zip(a, b)]
f = [a_val / b_val for a_val, b_val in zip(a, b)]
print(c)
print(d)
print(e)
print(f)
実行結果
[3, 6, 9, 12, 15]
[-1, -2, -3, -4, -5]
[2, 8, 18, 32, 50]
[0.5, 0.5, 0.5, 0.5, 0.5]
def文を使う方法
def文で目的の計算を定義したのち、map関数を使うとリストの要素を全て一度に計算することができます。
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
def plus(a_val, b_val):
return a_val + b_val
def minus(a_val, b_val):
return a_val - b_val
def times(a_val, b_val):
return a_val * b_val
def divide(a_val, b_val):
return a_val / b_val
c = map(plus, a, b)
d = map(minus, a, b)
e = map(times, a, b)
f = map(divide, a, b)
print(list(c))
print(list(d))
print(list(e))
print(list(f))
実行結果
[3, 6, 9, 12, 15]
[-1, -2, -3, -4, -5]
[2, 8, 18, 32, 50]
[0.5, 0.5, 0.5, 0.5, 0.5]
この場合でもリスト内の要素数が異なっていたら、短い方に合わせて計算してくれます。
a = [1, 2, 3, 4, 5, 6]
b = [2, 4, 6, 8, 10]
def plus(a_val, b_val):
return a_val + b_val
def minus(a_val, b_val):
return a_val - b_val
def times(a_val, b_val):
return a_val * b_val
def divide(a_val, b_val):
return a_val / b_val
c = map(plus, a, b)
d = map(minus, a, b)
e = map(times, a, b)
f = map(divide, a, b)
print(list(c))
print(list(d))
print(list(e))
print(list(f))
実行結果
[3, 6, 9, 12, 15]
[-1, -2, -3, -4, -5]
[2, 8, 18, 32, 50]
[0.5, 0.5, 0.5, 0.5, 0.5]
表示する際、リストに変換することをお忘れなく。
lambda式を使う方法
def文とmap関数を使えるのなら、lambda式を使うのも簡潔に書ける良い方法です。
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
c = map(lambda a_val, b_val: a_val + b_val, a, b)
d = map(lambda a_val, b_val: a_val - b_val, a, b)
e = map(lambda a_val, b_val: a_val * b_val, a, b)
f = map(lambda a_val, b_val: a_val / b_val, a, b)
print(list(c))
print(list(d))
print(list(e))
print(list(f))
実行結果
[3, 6, 9, 12, 15]
[-1, -2, -3, -4, -5]
[2, 8, 18, 32, 50]
[0.5, 0.5, 0.5, 0.5, 0.5]
もちろん二つのリストの要素数が異なっていたら、短い方に合わせて計算してくれます。
a = [1, 2, 3, 4, 5, 6]
b = [2, 4, 6, 8, 10]
c = map(lambda a_val, b_val: a_val + b_val, a, b)
d = map(lambda a_val, b_val: a_val - b_val, a, b)
e = map(lambda a_val, b_val: a_val * b_val, a, b)
f = map(lambda a_val, b_val: a_val / b_val, a, b)
print(list(c))
print(list(d))
print(list(e))
print(list(f))
実行結果
[3, 6, 9, 12, 15]
[-1, -2, -3, -4, -5]
[2, 8, 18, 32, 50]
[0.5, 0.5, 0.5, 0.5, 0.5]
次回はPythonのpandasでデータフレームをcsv、tsvファイルとして保存する方法と読み込む方法を紹介します。
ではでは今回はこんな感じで。
コメント