python 2.7のタプルで1要素を作るときは要素の後にカンマをつける

追記:タイトルを修正しました

タイトルで出落ちです。

zip関数で多次元配列的なものを作るとき、主にfor文で複数の同要素数のリストを同時に回したいときに使ったりしますが、

>>> zip((1,2,3),(10,20,30))
[(1, 10), (2, 20), (3, 30)]

これだとダメです。

>>> zip((1),(10))
>>> Traceback (most recent call last):
>>> File "<stdin>", line 1, in <module>
>>> TypeError: zip argument #1 must support iteration
>>>

え、タプルがイテレーターじゃない・・・??

不思議に思ってtype関数で見るとタプルに1つしか要素がないとイテレータにならないようです。まじですか。まじですか!!

>>> type((1))
<type 'int'>

本当だった。。。(震え声)

調べ直したら公式にもちゃんと書いてあります。

問題は 0 個または 1 個の項目からなるタプルの構築です。これらの操作を行うため、構文には特別な細工がされています。

丸括弧は演算などで処理の優先を決めたりするものでもあるので、タプルとはならないわけですね。

# 例えばタプルのタプルと称してこう書いても同じです
>>> type(((1)))
int

で、どうすればいいかというと、潔くリストを使う。(間違い防止も込めてですが)。

もしくは公式チュートリアル通り、カンマを付けてタプルを生成するようにする。

>>> zip([1],[10])
[(1, 10)]

>>> zip((1,),(10,))
[(1, 10)]

今日テストを書いていて、パラメーターのリストにタプルを使った時に、うまく行かなく一日ハマってました(;_;)

確認環境

  • python 2.7.6
  • win 8.1 64bit
  • Mac OS X 10.9

参考

About Me

買ったり作ったり考えたり試したの日々の記録です