Pythonのリストを結合する(要素を追加する):足し算・かけ算の記号とextend・appendの使い方
Pythonのリストはプラスで結合できます。
a = [1, 2, 3]
b = [4, 5]
c = a + b
print(c)
# [1, 2, 3, 4, 5]
数の足し算と同じ感覚でリストを結合できるところは Python の強みです。リストを三つ足すこともできます。
x = ['a', 'b']
y = ['c']
z = ['d', 1, 2]
p = x + y + z
print(p)
# ['a', 'b', 'c', 'd', 1, 2]
リストと空のリストを足したらどうなるでしょうか?
x = ['a', 'b']
y = []
p = x + y
print(p)
# ['a', 'b']
予想通りなにも追加されません。空のリストは 0 と同じように扱われます。
リストの足し算をループで使う
Python の for と range を使って同じリストを複数回つなげることも可能です。
a = ['a', 'b']
b = []
for n in range(3):
b = b + a
print(b)
# ['a', 'b', 'a', 'b', 'a', 'b']
a というリストが 3 つ結合されています。同じものを何回も足すことができるということは、リストをかけ算できるということでしょうか?
リストのかけ算
Python ではリストのかけ算も用意されています。
x = [1, 2]
a = x * 1
b = x * 2
c = x * 3
print(a) # [1, 2]
print(b) # [1, 2, 1, 2]
print(c) # [1, 2, 1, 2, 1, 2]
もし 0 をかけたらどうなるか?
x = [1, 2]
a = x * 0
b = x * -1
c = x * -2
print(a) # []
print(b) # []
print(c) # []
0 やマイナスの数をかけると空のリストが返ります。次の例はもっと極端です。
x = []
a = x * 1
b = x * 2
c = x * 3
print(a) # []
print(b) # []
print(c) # []
要素のないリストをかけ算すると、やはり要素のない空のリストが返ります。
リストの足し算とかけ算を組み合わせる
ここまできたら次のようなコードを書きたくなるでしょう。
x = [1, 2, 3]
y = ['a', 'b']
z = (x + y) * 2
print(z)
# [1, 2, 3, 'a', 'b', 1, 2, 3, 'a', 'b']
Python プログラマーの期待を裏切らない結果になりました。足し算とかけ算が混ざった演算もリストはこなします。
リストの引き算と割り算
リストの足し算とかけ算があるなら、引き算と割り算もあっていいと思いますね。残念なことにありません。
x = [1, 2, 3, 4]
y = [1, 2]
a = x - y
# TypeError: unsupported operand type(s) for -: 'list' and 'list'
割り算もできません。
x = [1, 2]
a = x / 1
b = x / 2
c = x / 3
# TypeError: unsupported operand type(s) for /: 'list' and 'int'
引き算も割り算も TypeError となります。
リストの足し算:extend を使うパターン
リストの結合は関数からも実行できます。
x = [1, 2, 3]
y = [4, 5]
x.extend(y)
print(x)
# [1, 2, 3, 4, 5]
この関数はプラス記号を使った「足し算」とどう違うのでしょうか?この関数は、もとのリストを操作してなにも返しません。一方、足し算は結合したリストを返します。
x = [1, 2, 3]
y = [4, 5]
z = x + y
print(z)
# [1, 2, 3, 4, 5]
x.extend(y)
print(x)
# [1, 2, 3, 4, 5]
要素を追加する
一つの要素をリストに追加するときは append を使います。
x = [1, 2, 3]
y = 'a'
x.append(y)
print(x)
# [1, 2, 3, 'a']
append も extend と同様にもとのリストを変えます。
追記:引き算は本当にできないか?
リストそのものの引き算はできませんが、集合の引き算はできます。
x = {1, 2, 3, 4}
y = {1, 2}
z = x - y
print(z)
# {3, 4}
つまりリストを一度集合にすれば引き算も可能です。
x = [1, 2, 3, 4]
y = [1, 2]
z = set(x) - set(y)
print(z)
# {3, 4}
w = list(z)
print(w)
# [3, 4]
リストの引き算
- リストを集合にする
- 集合の引き算をする
- 得られた集合をリストにする
この手順で一応引き算も可能になりますが、集合は順序を持たないため、得られるリストともとのリストの順序が一致しない可能性があります。つまりこの方法は厳密な意味での引き算とはいえません。