python2系なら sum
でスマートに書ける!
微妙なやり方しかないなーと思っていたらスマートに書けることに気がついた。
python ではリスト同士の加算がサポートされていて、
[1,2,3] + [4,5,6] => [1,2,3,4,5,6]
sum関数が第二引数に初期値を指定できることを利用して、
data = [[1,2,3], [4,5,6], [7,8,9]]
sum(data, [])
こう書けるのである。
とはいえ、あくまでリストでなければダメでタプルやジェネレータはサポートされないのがちょっと融通効かないんだけど。
補足1
python3系では sum が型チェックしてるみたいでこの方法は使えない。無念。
補足2
これを利用すると、__add__
を実装したインスタンスであればまとめて sum で処理できるということに・・・なるかと思って調べてみた。
>>> a = [1,2,3]
>>> data = [a, [4,5,6], [7,8,9]]
>>> sum(data,[])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
[1, 2, 3]
>>> empty = []
>>> sum(data,empty)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> empty
[]
>>>
内部ではあくまでも加算の結果で処理していることが予想される。
そこで、以下のように __add__
を持ったクラスを渡してやると、
>>> class A:
... def __add__(self, target):
... self.target = target
... return 100
...
>>> a = A()
>>> sum([5,10,15,20],a)
145
>>> a.target
5
・・・まあ、__add__
を破壊的な実装にするなということなのは理解しているつもりである。