Pythonでリストをタプルに変換する


544

リストをタプルに変換しようとしています。

Googleのほとんどのソリューションは次のコードを提供します:

l = [4,5,6]
tuple(l)

ただし、コードを実行するとエラーメッセージが表示されます。

TypeError: 'tuple'オブジェクトは呼び出し可能ではありませんこの問題を解決するにはどうすればよいですか?


78
tuple以前に他の場所で変数名を割り当てましたか?
eumiro 2012年

18
過度にうるさいというわけではありませんが、1に類似しているため、変数名として小文字の「el」を使用しないでください。ゼロに類似しているため、大文字の「oh」も同じです。「li」でさえ、比較するとはるかに読みやすくなっています。
Albert Rothman

回答:


815

正常に動作するはずです。使用しないでくださいtuplelistまたは変数名などの他の特殊な名前。それはおそらくあなたの問題を引き起こしているものです。

>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)

109

eumiroのコメントを展開すると、通常tuple(l)はリストlがタプルに変換されます。

In [1]: l = [4,5,6]

In [2]: tuple
Out[2]: <type 'tuple'>

In [3]: tuple(l)
Out[3]: (4, 5, 6)

ただし、:tupleではなくタプルとして再定義した場合type tuple

In [4]: tuple = tuple(l)

In [5]: tuple
Out[5]: (4, 5, 6)

タプル自体は呼び出すことができないため、TypeErrorが発生します。

In [6]: tuple(l)
TypeError: 'tuple' object is not callable

の元の定義を復元するにはtuple、インタープリターを終了して再起動するか、(@ glglglに感謝):

In [6]: del tuple

In [7]: tuple
Out[7]: <type 'tuple'>

29

あなたはこのようなことをしたかもしれません:

>>> tuple = 45, 34  # You used `tuple` as a variable here
>>> tuple
(45, 34)
>>> l = [4, 5, 6]
>>> tuple(l)   # Will try to invoke the variable `tuple` rather than tuple type.

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    tuple(l)
TypeError: 'tuple' object is not callable
>>>
>>> del tuple  # You can delete the object tuple created earlier to make it work
>>> tuple(l)
(4, 5, 6)

あなたが使用しているので、ここでの問題は...だtuple保持する変数をtuple (45, 34)早く...だからを、今tupleあるobjectタイプのtupleなりました...

それはもはやa typeではないので、もはやありませんCallable

Never組み込みの型を変数名として使用します...使用する他の名前があります。代わりに、変数に任意の名前を使用してください...


25

に別の選択肢を追加するtuple(l)には、Python> =以降で3.5次のようにできます。

t = *l,  # or t = (*l,) 

短く、少し高速ですが、おそらく読みやすさに問題があります。

これは基本l的に、単一のコンマが存在するために作成されるタプルリテラル内にリストをアンパックします,


Ps:受け取っているエラーは、名前のマスキング、tupleつまり名前タプルにどこかに割り当てられているためtuple = (1, 2, 3)です。

del tupleあなたを使用して行くのが良いでしょう。


4

多くの回答が最新で適切に回答されていることがわかりましたが、回答のスタックに新しいものが追加されます。

Pythonではこれを行う無限の方法があります、ここにいくつかのインスタンスがあります
通常の方法

>>> l= [1,2,"stackoverflow","python"]
>>> l
[1, 2, 'stackoverflow', 'python']
>>> tup = tuple(l)
>>> type(tup)
<type 'tuple'>
>>> tup
(1, 2, 'stackoverflow', 'python')

スマートな方法

>>>tuple(item for item in l)
(1, 2, 'stackoverflow', 'python')

タプルは不変であり、貴重なものを格納するために使用されることを忘れないでください。たとえば、パスワード、キー、ハッシュはタプルや辞書に保存されます。ナイフが必要な場合、なぜ刀を使ってリンゴを切るのか。それを賢く使ってください、それはまたあなたのプログラムを効率的にします。


2
2番目の方法の利点は何ですか?
Granny Aching

@GrannyAchingは、スマートのこの現代の世界の定義が変わり続けています。これは、一行で行われる遅延アプローチであるため、スマートな方法だと思います。
TheExorcist 19/7/25

1
tuple(l)(最初の方法)はtuple(item for item in l)(2番目の方法)よりも短い。
Granny Aching
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.