2013-05-08 3 views
23

Я стремлюсь преобразовать строку в кортеж, не разделяя символы строки в процессе. Может ли кто-нибудь предложить простой способ сделать это. Нужен один лайнер.Python преобразование строки в кортеж без разделения символов

Сбой

a = 'Quattro TT' 
    print tuple(a) 

Работы

a = ['Quattro TT'] 
    print tuple(a) 

Поскольку мой вклад является строка, я попробовал этот код путем преобразования строки в список, который снова расщепляет строку в символов.

Сбой

a = 'Quattro TT' 
print tuple(list(a)) 

Ожидаемый результат:

('Quattro TT') 

сгенерированным:

('Q', 'u', 'a', 't', 't', 'r', 'o', ' ', 'T', 'T') 
+4

Ожидаемый результат должен быть '('Quattro TT',)'; примечание: запятая. – jfs

+0

Строка не преобразуется в кортеж, она содержится в кортеже. – moooeeeep

+0

@ J.F.Sebastian Разве это имеет значение? В чем разница btw ('Quattro TT',) и ('Quattro TT')? – Shankar

ответ

43

Вы можете просто сделать (a,). Нет необходимости использовать функцию. (Обратите внимание, что запятая необходимо.)

По существу, означает, что tuple(a) сделать кортеж из содержания из a, а не кортежа, состоящий только из самого a. «Содержимое» строки (то, что вы получаете, когда вы ее перебираете) - это ее символы, поэтому она разделяется на символы.

+3

'tuple ([a])' ​​будет работать тоже. для полноты было бы неплохо, если бы вы объяснили, почему строка получает split – jterrace

+5

@jterrace: не 'tuple ([a])' ​​создает ненужный список, а '(a,)' строит кортеж, не проходя временный ? – sfstewman

+0

Да, не утверждал, что он был более эффективным, но, возможно, немного более читаемым – jterrace

12

Посмотрите на Python tutorial on tuples:

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

>>> empty =() 
>>> singleton = 'hello', # <-- note trailing comma 
>>> len(empty) 
0 
>>> len(singleton) 
1 
>>> singleton 
('hello',) 

Если поставить только пару скобок вокруг строкового объекта, они будут только превратить это выражение в parenthesized expression (курсив добавлен):

выражение в скобках список урожайности независимо от того, что дает этот список выражений: если список содержит хотя бы одну запятую, он дает кортеж; в противном случае он дает единственное выражение, которое составляет список выражений.

Пустая пара круглых скобок дает пустой объект кортежа. Поскольку кортежи неизменяемы, применяются правила для литералов (т. Е. Два вхождения пустого кортежа могут или не могут дать тот же объект).

Обратите внимание, что кортежи не формируются скобками, а используются с помощью оператора запятой. Исключением является пустой кортеж, для которого требуются круглые скобки, что позволяет безраздельно «ничего» в выражениях вызывать неоднозначность и допускать, что общие опечатки проходят неотображаемые.

То есть (предполагается, что Python 2.7),

a = 'Quattro TT' 
print tuple(a)  # <-- you create a tuple from a sequence 
         #  (which is a string) 
print tuple([a])  # <-- you create a tuple from a sequence 
         #  (which is a list containing a string) 
print tuple(list(a)) # <-- you create a tuple from a sequence 
         #  (which you create from a string) 
print (a,)   # <-- you create a tuple containing the string 
print (a)    # <-- it's just the string wrapped in parentheses 

Выход, как и ожидалось:

('Q', 'u', 'a', 't', 't', 'r', 'o', ' ', 'T', 'T') 
('Quattro TT',) 
('Q', 'u', 'a', 't', 't', 'r', 'o', ' ', 'T', 'T') 
('Quattro TT',) 
Quattro TT 

Чтобы добавить некоторые заметки на заявлении для печати. Когда вы пытаетесь создать одноэлементный кортеж как часть инструкции print в Python 2.7 (как в print (a,)), вам нужно использовать форму в скобках, потому что конечная запятая print a, будет также считаться частью оператора печати и, следовательно, новая строка должна быть подавлена ​​с выхода, а не с создаваемого кортежа:

Символ '\ n' записывается в конце, если оператор печати не заканчивается запятой.

В Python 3.x большинство из выше приведенных в примерах фактически поднять SyntaxError, потому что в Python 3 printturns into a function (вам нужно добавить дополнительную пару скобок). Но особенно это может вызвать путаницу:

print (a,)   # <-- this prints a tuple containing `a` in Python 2.x 
         #  but only `a` in Python 3.x 
+0

Я подчеркнул запятую. Заполняйте откат. – jfs

+0

@ J.F.Sebastian все в порядке. – moooeeeep

+0

+1 для тщательности – jterrace

5

Только в случае, если кто-то приходит сюда, пытаясь узнать, как создать кортеж назначая каждую часть строки «Quattro» и «ТТ» к элементу списка, будет выглядеть так: print tuple(a.split())

0

Подклассифицирующий кортеж, в котором некоторые из этих подклассов, возможно, должны быть однострочными экземплярами, бросает что-то интересное.

class Sequence(tuple): 
    def __init__(self, *args): 
     # initialisation... 
     self.instances = [] 

    def __new__(cls, *args): 
     for arg in args: 
      assert isinstance(arg, unicode), '# arg %s not unicode' % (arg,) 
     if len(args) == 1: 
      seq = super(Sequence, cls).__new__(cls, (args[ 0 ],)) 
     else: 
      seq = super(Sequence, cls).__new__(cls, args) 
     print('# END new Sequence len %d' % (len(seq),)) 
     return seq 

NB, как я узнал из этой темы, вы должны поставить запятую после args[ 0 ].

Линия печати показывает, что одна строка не разделяется.

NB запятая в конструкторе подкласса теперь становится необязательным:

Sequence(u'silly') 

или

Sequence(u'silly',) 
1

Я использую эту функцию, чтобы преобразовать строку в кортеж

def parse_tuple(string): 
    try: 
     s = eval(str(string)) 
     if type(s) == tuple: 
      return s 
     return 
    except: 
     return 

Использование

foo = '("A","B","C",)' 
value = parse_tuple(foo) # Result: ('A', 'B', 'C') 



В вашем случае, вы

value = parse_tuple("('%s',)" % a) 
-1

Это покрывает только простой случай:

a = ‘Quattro TT’ 
print tuple(a) 

Если вы используете только разделитель, как «», то она могла бы работать.

Я использовал строку из configparser так:

list_users = (‘test1’, ‘test2’, ‘test3’) 
and the i get from file 
tmp = config_ob.get(section_name, option_name) 
>>>”(‘test1’, ‘test2’, ‘test3’)” 

В этом случае указанное решение не работает. Однако это действительно работает:

def fot_tuple(self, some_str): 
    # (‘test1’, ‘test2’, ‘test3’) 
    some_str = some_str.replace(‘(‘, ”) 
    # ‘test1’, ‘test2’, ‘test3’) 
    some_str = some_str.replace(‘)’, ”) 
    # ‘test1’, ‘test2’, ‘test3’ 
    some_str = some_str.replace(“‘, ‘”, ‘,’) 
    # ‘test1,test2,test3’ 
    some_str = some_str.replace(“‘”, ‘,’) 
    # test1,test2,test3 
    # and now i could convert to tuple 
    return tuple(item for item in some_str.split(‘,’) if item.strip()) 
Смежные вопросы