Pyderman
Pyderman

Reputation: 16199

Why is a tuple of tuples of length 1 not actually a tuple unless I add a comma?

Given a tuple of tuples T:

(('a', 'b'))

and an individual tuple t1:

('a','b')

why does:

t1 in T

return False?

UPDATE: From Ipython:

In [22]: T = (('a','b'))

In [23]: t1 = ('a','b')

In [24]: t1 in T
Out[24]: False

And how then to check that a tuple is in another tuple?

Upvotes: 4

Views: 7329

Answers (3)

kylieCatt
kylieCatt

Reputation: 11039

Doing this (('a', 'b')) does not make a tuple containing a tuple as you can see here:

    >>> T = (('a','b'))
    >>> T
    ('a', 'b')

To make a single element tuple you need to add a trailing comma:

    >>> T = (('a','b'),)
    >>> t1 in T
    True
    >>> T
    (('a', 'b'),)

In fact the parenthesis aren't even a requirement as this will also create a tuple:

    >>> t1 = 'a','b'
    >>> t1
    ('a', 'b')
    >>> 1,2,3,4,5,6
    (1, 2, 3, 4, 5, 6)

Upvotes: 3

cdarke
cdarke

Reputation: 44354

The problem is because T is not a tuple of tuples, it is just a tuple. The comma makes a tuple, not the parentheses. Should be:

>>> T = (('a','b'),)
>>> t1 = ('a', 'b')
>>> t1 in T
True

In fact, you can loose the outer parentheses:

>>> T = ('a','b'),
>>> t1 = 'a','b'
>>> type(T)
<type 'tuple'>
>>> type(T[0])
<type 'tuple'>
>>> type(t1)
<type 'tuple'>
>>> t1 in T
True

Although sometimes they are needed for precedence, if in doubt put them in. But remember, it is the comma that makes it a tuple.

Upvotes: 14

viraptor
viraptor

Reputation: 34145

Check again. You likely have a bug somewhere else in your code. This check does work.

As for the update, you're not creating a nested tuple.

(('a', 'b')) == ('a', 'b')

If you need a one-element tuple, you need a trailing coma:

(('a', 'b'),)

Upvotes: 3

Related Questions