タイトルそのままですが,配列の要素が持つ関数を実行する方法をメモ的に残したいと思って書いておきます.
配列と言いつつメモ程度なのでlistで記述してますが,そこはご愛嬌でお願いします✌︎('ω'✌︎ )
環境
- macOS Mojave 10.14.5
- python 3.7.3
対象読者
- 筆者自身(万が一読まれても不快に思われない程度に書いてるつもりです)
実行方法
仮に下記のようなclassが存在するとします.
class sample():
def __init__(self, hoge, fuga):
self.hoge = hoge
self.fuga = fuga
def add(self):
return self.hoge + self.fuga
そして配列はこんな感じです.
from sample_class import sample
hogehoge = [sample(hoge=i, fuga=i*2) for i in range(10)]
当たり前ですが,以下のような実行はできません.
>>> from sample_class import sample
>>> hogehoge = [sample(hoge=i, fuga=i*2) for i in range(10)]
>>> hogehoge.add()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'add'
こんな風にlist
オブジェクトにadd
なんて関数は存在しないと怒られてしまいます.
考えれば当然ですがadd
を持っているのは配列内の要素だからです.
なので要素を取り出す必要があり,取り出した要素の関数を1つずつ実行していきます.
for文で実行する
このやり方が一番わかりやすいかと思います.先ほど作成した配列hogehoge
から1つずつ取り出して要素h.add()
で実行しています.ただこれだけだと新しい配列にならないので,空の配列hoge_add
にappend
で追加しています.
>>> hoge_add = []
>>> for h in hogehoge:
... hoge_add.append(h.add())
...
>>> hoge_add
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
内包表記を使用する
わざわざ実行してリストに追加するなら,それを1行にしてしまえ!という感じでかけます.
>>> hoge = [h.add() for h in hogehoge]
>>> hoge
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
わざわざ空の配列を宣言する必要もなくなり,append
も不要になりました!とてもシンプルですね!
mapを使用する
一風変わって関数を使用して実行します.
mapの説明やlambdaの紹介はここでは省きます.
>>> hoge = list(map(lambda x: x.add(),hogehoge))
>>> hoge
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
内包表記との違いは速度面などにあるみたいです.これについても詳しく知りたい方はこちらをご覧ください.
まとめ
今回は3つの方法で配列の要素の持つ関数を実行してみました.一概にどの方法がいいとかいうわけではなく,場合によっては冗長でもfor
で書く必要もあると思います.なので,コーディングする際の引き出し程度に覚えておくと便利かと思います.
また,この他にもっと楽な方法とかご存知の方は,コメントお待ちしてます!!
参考
map と filter ってなに?
Python の map とfor内包表記(リスト内包表記)は結局どっちが速い?
Pythonのlambdaって分かりやすい