【问题标题】:Format string with all elements of a list使用列表的所有元素格式化字符串
【发布时间】:2013-01-17 13:46:52
【问题描述】:
words = ['John', 'nice', 'skateboarding']
statement = "%s you are so %s at %s" % w for w in words

产生

File "<stdin>", line 1
statement = "%s you are so %s at %s" % w for w in words
                                           ^
SyntaxError: invalid syntax

我在这里做错了什么?假设是:len(words) == 语句中“%s”的数量

【问题讨论】:

    标签: python string list string-formatting


    【解决方案1】:

    您还可以将新的.format 样式字符串格式与“splat”运算符一起使用:

    >>> words = ['John', 'nice', 'skateboarding']
    >>> statement = "{0} you are so {1} at {2}".format(*words)
    >>> print (statement)
    John you are so nice at skateboarding
    

    即使你传递了一个生成器,这也有效:

    >>> statement = "{0} you are so {1} at {2}".format(*(x for x in words))
    >>> print (statement)
    John you are so nice at skateboarding
    

    虽然在这种情况下,当您可以直接传递words 时,不需要传递生成器。

    我认为非常漂亮的最后一种形式是:

    >>> statement = "{0[0]} you are so {0[1]} at {0[2]}".format(words)
    >>> print statement
    John you are so nice at skateboarding
    

    【讨论】:

      【解决方案2】:
      >>> statement = "%s you are so %s at %s" % tuple(words)
      'John you are so nice at skateboarding'
      

      【讨论】:

        【解决方案3】:

        有两点是错的:

        • 您不能创建没有括号括起来的生成器表达式。简单地说w for w in words 是python 的无效语法。

        • % 字符串格式化运算符需要一个元组、一个映射或单个值(不是元组或映射)作为输入。生成器不是元组,它会被视为单个值。更糟糕的是,生成器表达式不会被迭代:

          >>> '%s' % (w for w in words)
          '<generator object <genexpr> at 0x108a08730>'
          

        所以下面的方法会起作用:

        statement = "%s you are so %s at %s" % tuple(w for w in words)
        

        请注意,您的生成器表达式实际上并没有转换单词或从words 列表中进行选择,因此这里是多余的。所以最简单的方法是将列表转换为tuple

        statement = "%s you are so %s at %s" % tuple(words)
        

        【讨论】:

        • tuple(w for w in words) 是矫枉过正 :) 看我的回答。
        • @AlexeyKachayev:当然,但还有更多。我可能提交得太早了;现在更新了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多