Python将字符串转换为元组而不分割字符

时间:2013-05-08 20:00:13

标签: python list python-2.7 python-3.x tuples

我正在努力将字符串转换为元组,而不会在过程中拆分字符串的字符。有人可以建议一个简单的方法来做到这一点。需要一个班轮。

失败

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

10 个答案:

答案 0 :(得分:56)

你可以(a,)。无需使用功能。 (请注意,逗号是必要的。)

基本上,tuple(a)表示创建a内容的元组,而不是仅由a本身组成的元组。字符串的“内容”(迭代它时得到的)是它的字符,这就是它被分割成字符的原因。

答案 1 :(得分:16)

查看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语句的一部分时(如在print (a,)中),您需要使用带括号的表单,因为print a,的尾随逗号否则将被视为print语句的一部分,从而导致从输出中抑制换行而不是创建元组:

  

最后写一个'\ n'字符,除非print语句以逗号结尾。

在Python 3.x中,上述示例中的大多数用法实际上会引发SyntaxError,因为在Python 3中print turns into a function(您需要添加一对额外的括号) 。 但特别是这可能会引起混淆:

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

答案 2 :(得分:5)

以防有人来到这里试图知道如何创建一个元组,将字符串“Quattro”和“TT”的每个部分分配给列表中的元素,它就像这样 print tuple(a.split())

答案 3 :(得分: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)

答案 4 :(得分:1)

您可以使用以下解决方案:

s="jack"

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

output=('jack')

答案 5 :(得分:1)

您可以使用file1.xml file2.xml etc

eval()

答案 6 :(得分: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

我从这个帖子中学到的东西,你必须把逗号放在args[ 0 ]之后。

打印行显示单个字符串不会被拆分。

注意,子类构造函数中的逗号现在变为可选:

Sequence( u'silly' )

Sequence( u'silly', )

答案 7 :(得分:0)

请参阅:

'Quattro TT'

是一个字符串。

由于字符串是字符列表,因此与

相同
['Q', 'u', 'a', 't', 't', 'r', 'o', ' ', 'T', 'T']

现在...

['Quattro TT']

是一个列表,列表的第一个位置是字符串。

还...

a = 'Quattro TT'

list(a)

是一个字符串,已转换为列表。

同样,由于字符串是一个字符列表,因此变化不大。

其他信息...

tuple(something)

这会将某些内容转换为元组。

了解所有这些情况,我认为您可以得出结论,一切都没有失败。

答案 8 :(得分:-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())

答案 9 :(得分:-1)

val_1=input("").strip(")(").split(",") #making a list from the string

if val_1[0].isdigit()==True: #checks if your contents are all integers
  val_2 = []
  for i in val_1:
    val_2.append(int(i))
  val_2 = tuple(val_2)
  print(val_2)
else: # if the contents in your tuple are of string, tis case is applied
  val_2=[]
  for i in range(0,len(val_1)):
      if i==0:
         val_2.append(val_1[i][1:-1])
      else:
         val_2.append(val_1[i][2:-1])

  val_2=tuple(val_2)
  print(val_2)