Як створити кортеж лише з одним елементом


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

Відповіді:


140

Тому що ці перші два елементи - це не кортежі; вони просто струнні. Дужки автоматично не роблять їх кортежами. Ви повинні додати кому після рядка, щоб вказати python, що це повинен бути кортеж.

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

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

Щоб виправити свій прикладний код, додайте сюди коми:

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

             ^       ^

З Документів Python :

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

Якщо ви справді ненавидите синтаксис трепетої кома, вирішення полягає в тому, щоб перейти listдо tuple()функції:

x = tuple(['a'])

6
Це не дуже елегантно і виглядає заплутано. Чи є інший спосіб?
Роберт Мур

3
Це, здається, не працює. Наприклад: tuple ("abc") (з додатковою комою або без) дає ('a', 'b', 'c'), а ("abc",) дає ('abc'). Тож tuple (), здається, тут не є життєздатним варіантом.
Бен Фармер

3
@Ben Погляньте на документи . tuple приймає ітерабельний , який є рядком (ітерація над символами). Якщо ви наполягаєте на не використовуючи Кома, потім зробити проміжний список: tuple(['abc']).
Джонатан Райнхарт

Звичайно, я просто кажу, що функція кортежу не заперечує потреби у комах.
Бен Фармер

1
@matanster Синтаксис мови в цьому плані не змінився. AFAIK проблема однакова для Python 2 і 3.
Jonathon Reinhart

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')]
>>> 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.