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

7 ответов:

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

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

Взгляните на учебник Python по кортежам :

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

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

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

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

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

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

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

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

В 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

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

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

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)

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

s="jack"

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

output=('jack')

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

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

Это касается только простого случая:

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

Comments

    Ничего не найдено.