【问题标题】:Printing tuple with string formatting in Python在 Python 中使用字符串格式打印元组
【发布时间】:2010-11-30 03:32:58
【问题描述】:

所以,我有这个问题。 我得到了元组 (1,2,3) 我应该用字符串格式打印。 例如。

tup = (1,2,3)
print "this is a tuple %something" % (tup)

这应该打印带有括号的元组表示,例如

这是一个元组 (1,2,3)

但我得到的是TypeError: not all arguments converted during string formatting

我到底怎么能做到这一点?有点迷路了,所以如果你们能指出我正确的方向:)

【问题讨论】:

    标签: python


    【解决方案1】:

    这不使用字符串格式,但你应该可以这样做:

    print 'this is a tuple ', (1, 2, 3)
    

    如果你真的想使用字符串格式:

    print 'this is a tuple %s' % str((1, 2, 3))
    # or
    print 'this is a tuple %s' % ((1, 2, 3),)
    

    注意,这假设您使用的是早于 3.0 的 Python 版本。

    【讨论】:

      【解决方案2】:
      >>> thetuple = (1, 2, 3)
      >>> print "this is a tuple: %s" % (thetuple,)
      this is a tuple: (1, 2, 3)
      

      使用感兴趣的元组作为唯一项,即(thetuple,) 部分,制作一个单例元组是这里的关键位。

      【讨论】:

      • 在 Python 3 中 print 是一个函数,而不是一个语句,所以你必须写 print(....)
      【解决方案3】:
      >>> tup = (1, 2, 3)
      >>> print "Here it is: %s" % (tup,)
      Here it is: (1, 2, 3)
      >>>
      

      注意(tup,) 是一个包含元组的元组。外部元组是 % 运算符的参数。内部元组是它的内容,实际上是打印出来的。

      (tup) 是括号中的表达式,计算结果为tup

      (tup,) 后跟逗号是一个元组,其中包含 tup 作为唯一成员。

      【讨论】:

        【解决方案4】:
        t = (1, 2, 3)
        
        # the comma (,) concatenates the strings and adds a space
        print "this is a tuple", (t)
        
        # format is the most flexible way to do string formatting
        print "this is a tuple {0}".format(t)
        
        # classic string formatting
        # I use it only when working with older Python versions
        print "this is a tuple %s" % repr(t)
        print "this is a tuple %s" % str(t)
        

        【讨论】:

          【解决方案5】:

          我认为最好的方法是:

          t = (1,2,3)
          
          print "This is a tuple: %s" % str(t)
          

          如果您熟悉 printf 样式格式,那么 Python 支持它自己的版本。在 Python 中,这是使用应用于字符串的“%”运算符(模运算符的重载)来完成的,该运算符接受任何字符串并对其应用 printf 样式的格式。

          在我们的例子中,我们告诉它打印“这是一个元组:”,然后添加一个字符串“%s”,对于实际的字符串,我们传入一个元组的字符串表示形式(通过调用 str(t))。

          如果您不熟悉 printf 样式格式,我强烈建议您学习,因为它非常标准。大多数语言都以一种或另一种方式支持它。

          【讨论】:

            【解决方案6】:

            请注意,% 语法已过时。使用str.format,更简单易读:

            t = 1,2,3
            print 'This is a tuple {0}'.format(t)
            

            【讨论】:

            • 我在stackoverflow.com/a/26249755/1676424 中添加了一条评论,用于 1 项元组的情况
            • 我从来不知道为什么% 已经过时了,但我现在总是你str.format 无论如何,盲目的。没关系,我对完整的限定符感兴趣,因为简单的{0} 不是完整的限定符,而只是一个位置指示器。对于int,我称之为完整限定符的是{0:d}(或{3:d},例如,如果要打印的int 出现在str.format 方法的第4 个位置)。我尝试使用 {0:s} 限定符打印一个元组,但它不起作用。那么,像元组这样的东西的完整限定符是什么?
            • @Ray 这真的没有意义。您可以指定很多选项,可以在文档中找到。如果你想用str 打印一些东西,你可以说{!s},但这是默认的,所以没有必要。如果您想改用repr,可以使用{!r}。与% 不同,对于整数不需要说d
            • 我有点喜欢 % 语法,因为在我看来它比新格式更简洁,而且与我知道和喜爱的 c 字符串格式非常相似
            • 请注意,即使在 Python 3 上,% 也没有完全过时。事实上,如果你在logging 模块中使用.format 语法,pylint 甚至会报错:stackoverflow.com/a/34634301/534238
            【解决方案7】:

            请注意,如果元组只有一项,则将添加尾随逗号。例如:

            t = (1,)
            print 'this is a tuple {}'.format(t)
            

            你会得到:

            'this is a tuple (1,)'
            

            在某些情况下,例如你想得到一个带引号的列表,以便在 mysql 查询字符串中使用,例如

            SELECT name FROM students WHERE name IN ('Tom', 'Jerry');
            

            您需要考虑在格式化后删除尾逗号使用 replace(',)', ')') 因为元组可能只有 1 个类似 ('Tom',) 的项目,因此尾逗号需要被删除:

            query_string = 'SELECT name FROM students WHERE name IN {}'.format(t).replace(',)', ')')
            

            请建议您是否有在输出中删除此逗号的好方法。

            【讨论】:

            • 我通常更喜欢'这是一个元组 ({})'.format(', '.join(map(str, t))) 之类的东西。这样您就不必担心会弄乱格式字符串中现有的逗号或括号。
            • 您不应该在数据库查询中使用format()。每个库中都有适用的方法。
            • @ktalik 你显然不明白这一点。 format() 与数据库查询无关。 format() 是 python 字符串操作的常用函数。看看docs.python.org/2/library/string.html,你会从中学习。记住与数据库查询无关。
            • format() 与从用户收集的值一起使用可能会导致SQL 注入。在将输入值放入查询之前验证输入值更安全。有关详细信息,请参阅这些指南:dev.mysql.com/doc/connector-python/en/… 您还可以将参数值转换为数据库类型字符串表示,然后将其粘贴到查询字符串中。看看initd.org/psycopg/docs/usage.html,你有一个带有% 运算符的反例和一个带有execute() 方法的解决方案,其中查询参数在方法args 中传递。
            • @Paul Rooney 请注意我试图解释,如果元组只有一个项目,将添加尾随逗号。并且如果使用不当会造成麻烦。格式当然也可用于形成 SQL 查询。诽谤者从何而来??
            【解决方案8】:

            上面给出的许多答案都是正确的。正确的做法是:

            >>> thetuple = (1, 2, 3)
            >>> print "this is a tuple: %s" % (thetuple,)
            this is a tuple: (1, 2, 3)
            

            但是,对于 '%' 字符串运算符是否已过时存在争议。正如许多人所指出的,它绝对不会过时,因为'%' String 运算符更容易将 String 语句与列表数据结合起来。

            例子:

            >>> tup = (1,2,3)
            >>> print "First: %d, Second: %d, Third: %d" % tup
            First: 1, Second: 2, Third: 3
            

            但是,使用.format() 函数,您会得到一个冗长的语句。

            例子:

            >>> tup = (1,2,3)
            >>> print "First: %d, Second: %d, Third: %d" % tup
            >>> print 'First: {}, Second: {}, Third: {}'.format(1,2,3)
            >>> print 'First: {0[0]}, Second: {0[1]}, Third: {0[2]}'.format(tup)
            
            First: 1, Second: 2, Third: 3
            First: 1, Second: 2, Third: 3
            First: 1, Second: 2, Third: 3
            

            此外,'%' 字符串运算符对我们验证数据类型也很有用,例如%s%d%i,而 .format() only support two conversion flags: '!s''!r' .

            【讨论】:

            • 我过渡到使用 format() 但是 % 方法的优势(能够格式化元组的每个元素并进行转换)很大,所以我想我会回去。谢谢。
            • 您也可以为每个元素指定格式。 '{:d}{:s}'.format(1, '2')
            • “星号解压”元组适用于.format:tup = (1,2,3); print('First: {}, Second: {}, Third: {}'.format(*tup))
            【解决方案9】:

            说话很便宜,给你看代码:

            >>> tup = (10, 20, 30)
            >>> i = 50
            >>> print '%d      %s'%(i,tup)
            50  (10, 20, 30)
            >>> print '%s'%(tup,)
            (10, 20, 30)
            >>> 
            

            【讨论】:

              【解决方案10】:

              试试这个以获得答案:

              >>>d = ('1', '2') 
              >>> print("Value: %s" %(d))
              Traceback (most recent call last):
                File "<stdin>", line 1, in <module>
              TypeError: not all arguments converted during string formatting
              

              如果我们在 () 中只放一个元组,它自己会生成一个元组:

              >>> (d)
              ('1', '2')
              

              这意味着上面的打印语句将如下所示: print("Value: %s" %('1', '2')) 这是一个错误!

              因此:

              >>> (d,)
              (('1', '2'),)
              >>> 
              

              上面将被正确地提供给打印的参数。

              【讨论】:

                【解决方案11】:

                尽管这个问题已经很老了并且有很多不同的答案,但我仍然想添加最“pythonic”且可读/简洁的答案。

                由于 Antimony 已经正确显示了一般的 tuple 打印方法,因此这是单独打印元组中每个元素的附加功能,正如 Fong Kah Chun 使用 %s 语法正确显示的那样。

                有趣的是,它只在评论中提到过,但使用星号运算符解包元组会产生完全的灵活性和可读性,使用 str.format 方法单独打印元组元素时

                tup = (1, 2, 3)
                print('Element(s) of the tuple: One {0}, two {1}, three {2}'.format(*tup))
                

                这也避免了在打印单元素元组时打印尾随逗号,正如 Jacob CUI 使用 replace 所规避的那样。 (即使恕我直言,尾随逗号表示是正确的如果想在打印时保留类型表示):

                tup = (1, )
                print('Element(s) of the tuple: One {0}'.format(*tup))
                

                【讨论】:

                  【解决方案12】:

                  对于python 3

                  tup = (1,2,3)
                  print("this is a tuple %s" % str(tup))
                  

                  【讨论】:

                    【解决方案13】:

                    你也可以试试这个;

                    tup = (1,2,3)
                    print("this is a tuple {something}".format(something=tup))
                    

                    您不能将%something(tup) 一起使用,因为元组的打包和解包概念。

                    【讨论】:

                      【解决方案14】:

                      除了其他答案中提出的方法外,从 Python 3.6 开始,您还可以使用 Literal String Interpolation (f-strings):

                      >>> tup = (1,2,3)
                      >>> print(f'this is a tuple {tup}')
                      this is a tuple (1, 2, 3)
                      

                      【讨论】:

                        【解决方案15】:

                        在 python3 中使用 f-string 进行快速打印。

                        tup = (1,2,3)
                        print(f"this is a tuple {tup}")
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2016-06-21
                          • 1970-01-01
                          • 2021-11-11
                          • 1970-01-01
                          • 2018-04-12
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-04-05
                          相关资源
                          最近更新 更多