3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pythonでflattenを簡潔に書く裏技

Last updated at Posted at 2015-09-16

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__ を破壊的な実装にするなということなのは理解しているつもりである。

3
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?