要素が1つだけのタプルを作成する方法


107

以下の例では、すべての要素がタプルであると想定していますが、タプルに単一の文字列しか含まれていないのに、タプルが文字列に変換されるのはなぜですか?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>

1
('a')評価はちょうど'a'
oldrinb

1
-うわー3件の正しい 3分で回答:)しかし、の秘密の注意,a = 1, 2, 3; print a

26
大括弧はタプルを作成しませんが、コンマは作成します。
cdarke 2012年

17
@cdarke。ただし、空のタプル()は1組の括弧でのみ構成されます。
フレデリックハミディ2012年

2
確かに、またはむしろ、False空のタプルのほとんどすべてに適しています(私が何を意味するかを知っている場合)。
cdarke 2012年

回答:


140

最初の2つの要素はタプルではないためです。それらは単なる文字列です。括弧はそれらを自動的にタプルにしません。文字列の後にコンマを追加して、Pythonにタプルであることを示す必要があります。

>>> type( ('a') )
<type 'str'>

>>> type( ('a',) )
<type 'tuple'>

サンプルコードを修正するには、ここにカンマを追加します。

>>> a = [('a',), ('b',), ('c', 'd')]

             ^       ^

Pythonドキュメントから:

特別な問題は、0または1の項目を含むタプルの構築です。構文には、これらに対応するための追加の癖があります。空のタプルは、括弧の空のペアで構成されます。1つの項目を持つタプルは、値の後にコンマを付けて構成されます(単一の値を括弧で囲むだけでは不十分です)。醜いが効果的。

末尾のコンマ構文が本当に嫌いな場合、回避策はa listtuple()関数に渡すことです:

x = tuple(['a'])

6
これはあまりエレガントではありませんが、少し混乱しているように見えます。他に方法はありますか?
Robert Moore

3
それはうまくいかないようです。例:tuple( "abc")(余分なコンマの有無にかかわらず)は( 'a'、 'b'、 'c')を与えますが、( "abc"、)は( 'abc')を与えます。したがって、ここではtuple()は実行可能なオプションではないようです。
ベンファーマー

3
@Benのドキュメントをご覧ください 。文字列である反復可能なをtuple 受け入れます(文字を反復します)。末尾のコンマを使用しないと主張する場合は、中間リストを作成します。tuple(['abc'])
Jonathon Reinhart、2018年

もちろん、タプル関数はコンマの必要性を否定しないと言っています。
ベンファーマー

1
@matanster言語構文はこの点で変更されていません。私の知る限り、問題は、Python 2と3についても同様である
ジョナサン・ラインハルト

20

最初の2つの例はタプルではなく、文字列です。単一アイテムのタプルには、次のように末尾にコンマが必要です。

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]

11

('a') タプルではなく、単なる文字列です。

pythonそれらをtuple次のようにするには、末尾にカンマを追加する必要があります。

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.