Подтвердить что ты не робот

Преобразование строки в кортеж без разделения символов

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

Сбой

   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')
4b9b3361

Ответ 1

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

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

Ответ 2

Посмотрите учебник по Python для кортежей:

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

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

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

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

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

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

То есть (при условии 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 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, в противном случае, будет считаться частью оператор print и, таким образом, вызывать подавление перевода строки из выходных данных, а не создание кортежа:

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

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

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

Ответ 3

На всякий случай кто-то приходит сюда, пытаясь понять, как создать кортеж, назначая каждой части строки "Quattro" и "TT" элементу списка, это было бы так print tuple(a.split())

Ответ 4

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

import ast

def parse_tuple(string):
    try:
        s = ast.literal_eval(str(string))
        if type(s) == tuple:
            return s
        return
    except:
        return

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

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



В вашем случае вы делаете

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

Ответ 5

Вы можете использовать следующее решение:

s="jack"

tup=tuple(s.split(" "))

output=('jack')

Ответ 6

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

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', )

Ответ 7

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

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())