【问题标题】:Using Python String Formatting with Lists将 Python 字符串格式化与列表一起使用
【发布时间】:2011-11-25 23:40:06
【问题描述】:

我在 Python 2.6.5 中构造了一个字符串 s,它将具有不同数量的 %s 标记,这些标记与列表 x 中的条目数相匹配。我需要写出一个格式化的字符串。以下内容不起作用,但表明我正在尝试做的事情。在此示例中,有三个 %s 标记,列表包含三个条目。

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

我希望输出字符串是:

1 BLAH 2 FOO 3 BAR

【问题讨论】:

    标签: python string list formatting string-formatting


    【解决方案1】:

    你应该看看python的format方法。然后你可以像这样定义你的格式化字符串:

    >>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
    >>> x = ['1', '2', '3']
    >>> print s.format(*x)
    '1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'
    

    【讨论】:

    • OP的问题不是方法而是参数的格式。 % 运算符仅解包元组。
    • 这将使s 的构造更加复杂,因为我需要为每个位置包含递增的数字而不是简单的%ss 是通过多个不同的步骤构建的,因此只包含 %s 令牌要容易得多。
    • @SabreWolfy 如果您预先构造它,那么您可能会发现命名占位符并使用 dict 格式化结果字符串更容易:print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}
    • @SabreWolfy:在 Python 2.7 中,您可以省略字段编号:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
    • @kotchwane : * 函数是一个特殊的 python 关键字,它将作为列表的参数转换为参数列表:)。在我们的例子中,*x 会将 x 的 3 个成员传递给 format 方法。
    【解决方案2】:
    print s % tuple(x)
    

    而不是

    print s % (x)
    

    【讨论】:

    • (x)x 相同。将单个标记放在括号中在 Python 中没有任何意义。您通常将括号放在 foo = (bar, ) 中以使其更易于阅读,但 foo = bar, 的作用完全相同。
    • print s % (x) 是 OP 写的,我只是引用他/她的话。
    • 我只是提供语言提示,而不是批评您的答案(实际上我 +1 了)。你也没有写foo = (bar, ) :)
    • 为了清楚起见,我使用(x) 表示法;如果您稍后添加其他变量,它还可以避免忘记括号。
    • 如果你想从多个列表中获取你的变量呢? tuple 只需要一个列表,而格式化程序似乎只需要一个 tuple
    【解决方案3】:

    按照这个resource page,如果x的长度是变化的,我们可以使用:

    ', '.join(['%.2f']*len(x))
    

    为列表x 中的每个元素创建一个占位符。示例如下:

    x = [1/3.0, 1/6.0, 0.678]
    s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
    print s
    >>> elements in the list are [0.33, 0.17, 0.68]
    

    【讨论】:

      【解决方案4】:

      这是一个单行。使用带有 print() 的格式来迭代列表的一点即兴答案。

      这个怎么样(python 3.x):

      sample_list = ['cat', 'dog', 'bunny', 'pig']
      print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))
      

      在此处阅读有关使用 format() 的文档。

      【讨论】:

      • 星号 (*) 的含义或功能是什么?您指向文档的链接似乎没有说明这一点。
      • @kotchwane 星号将列表“扩展”为单个有序参数。 f(*x) == f(x[0], x[1], ..., x[n])。同样,两个星号 (**) 将 dict 扩展为关键字参数。
      【解决方案5】:

      因为我刚刚了解了这个很酷的东西(从格式字符串中索引到列表中),所以我要添加到这个老问题。

      s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
      x = ['1', '2', '3']
      print (s.format (x=x))
      

      输出:

      1 BLAH 2 FOO 3 BAR
      

      但是,我仍然没有弄清楚如何进行切片(在格式字符串 '"{x[2:4]}".format..., 内),如果有人有想法,我很想弄清楚,但是我怀疑你根本无法做到这一点。

      【讨论】:

      • 我对你的切片用例有点好奇。
      • 我真的没有...我想我只是觉得能够这样做会很整洁
      【解决方案6】:

      这是一个有趣的问题!另一种处理可变长度列表的方法是构建一个充分利用.format 方法和列表解包的函数。在下面的示例中,我没有使用任何花哨的格式,但可以轻松更改以满足您的需求。

      list_1 = [1,2,3,4,5,6]
      list_2 = [1,2,3,4,5,6,7,8]
      
      # Create a function that can apply formatting to lists of any length:
      def ListToFormattedString(alist):
          # Create a format spec for each item in the input `alist`.
          # E.g., each item will be right-adjusted, field width=3.
          format_list = ['{:>3}' for item in alist] 
      
          # Now join the format specs into a single string:
          # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
          s = ','.join(format_list)
      
          # Now unpack the input list `alist` into the format string. Done!
          return s.format(*alist)
      
      # Example output:
      >>>ListToFormattedString(list_1)
      '  1,  2,  3,  4,  5,  6'
      >>>ListToFormattedString(list_2)
      '  1,  2,  3,  4,  5,  6,  7,  8'
      

      【讨论】:

        【解决方案7】:

        与@neobot 的答案相同,但更现代和简洁。

        >>> l = range(5)
        >>> " & ".join(["{}"]*len(l)).format(*l)
        '0 & 1 & 2 & 3 & 4'
        

        【讨论】:

          【解决方案8】:
          x = ['1', '2', '3']
          s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR"
          print(s)
          

          输出是

          1 BLAH 2 FOO 3 BAR
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-06-17
            • 2020-08-30
            • 1970-01-01
            • 1970-01-01
            • 2014-06-23
            • 2011-08-06
            • 1970-01-01
            相关资源
            最近更新 更多