Как создать кортеж только из одного элемента

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
17
@cdarke, за исключением пустого кортежа (), который состоит только из пары круглых скобок.
Фредерик Хамиди,
2
Верно, вернее, Falseпустой кортеж подходит практически для всех (если вы понимаете, о чем я).
cdarke

Ответы:

141

Потому что эти первые два элемента не являются кортежами; они просто струны. Скобки не делают их автоматически кортежами. Вы должны добавить запятую после строки, чтобы указать python, что это должен быть кортеж.

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

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

Чтобы исправить ваш пример кода, добавьте сюда запятые:

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

             ^       ^

Из документов Python :

Особой проблемой является создание кортежей, содержащих 0 или 1 элемент: в синтаксисе есть некоторые дополнительные особенности для их устранения. Пустые кортежи состоят из пары пустых скобок; кортеж с одним элементом создается следующим образом за значением через запятую (недостаточно заключить одно значение в круглые скобки). Уродливо, но эффективно.

Если вы действительно ненавидите синтаксис Запятая, обходной путь, чтобы пропускать listк tuple()функции:

x = tuple(['a'])
Джонатон Рейнхарт
источник
7
Это не очень элегантно и выглядит немного запутанным. Есть ли другой путь?
Роберт Мур
3
Похоже, это не работает. Например: tuple ("abc") (с дополнительной запятой или без нее) дает ('a', 'b', 'c'), а ("abc",) дает ('abc'). Таким образом, tuple () здесь не подходит.
Бен Фармер
3
@Ben Посмотрите документы . tuple принимает итерацию , которой является строка (перебирает символы). Если вы настаиваете на не используя Запятая, затем сделать промежуточный список: tuple(['abc']).
Джонатон Рейнхарт
Конечно, я просто говорю, что функция кортежа не отменяет необходимости в запятой.
Бен Фармер
1
@matanster Синтаксис языка в этом отношении не изменился. AFAIK проблема одинакова для Python 2 и 3.
Джонатон Рейнхарт
20

Ваши первые два примера не являются кортежами, это строки. Кортежи с одним элементом требуют завершающей запятой, например:

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
Фредерик Хамиди
источник
11

('a') не кортеж, а просто строка.

Вам нужно добавить дополнительную запятую в конце, чтобы pythonони воспринимались как tuple: -

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
Рохит Джайн
источник