【Python基礎】二つのリストで同じインデックスの要素を足し算、引き算、掛け算、割り算する方法

  • URLをコピーしました!
目次

リスト同士の四則演算

前回、Pythonでリスト内の全ての数値に対して同じ値で足し算、引き算、掛け算、割り算する方法を紹介しました。

今回は二つのリストで同じインデックスの要素を足し算、引き算、掛け算、割り算する方法を紹介します。

それでは始めていきましょう。

正しく計算できない例

まずは正しく計算できない例です。

とりあえず数値のリストを二つ作成し、その二つのリスト同士で計算してみます。

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ファイルとして保存する方法と読み込む方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次