【问题标题】:How to use list (or tuple) as String Formatting value如何使用列表(或元组)作为字符串格式化值
【发布时间】:2011-03-14 14:16:05
【问题描述】:

假设这个变量:

s=['Python', 'rocks']
x = '%s %s' % (s[0], s[1])

现在我想替换更长的列表,并分别添加所有列表值,如 s[0]、s[1]、... s[n],似乎不对

引用自文档:

给定格式 % 值...如果格式 需要一个参数,值可以 是单个非元组对象。 [4] 否则,值必须是一个元组 正是指定的项目数 通过格式字符串,或单个 映射对象(例如,一个 字典)。

我尝试了许多将元组和列表作为格式化程序的组合,但没有成功,所以我想在这里问

我希望它很清楚

[编辑] 好吧,也许我不够清楚

我有很大的文本变量,比如

s = ['a', 'b', ..., 'z']

x = """some text block
          %s
          onother text block
          %s
          ... end so on...
          """ % (s[0], s[1], ... , s[26])

我想更简洁地更改% (s[0], s[1], ... , s[26]),而不是手动输入每个值

【问题讨论】:

    标签: python string


    【解决方案1】:

    您不必拼出所有索引:

    s = ['language', 'Python', 'rocks']
    some_text = "There is a %s called %s which %s."
    x = some_text % tuple(s)
    

    s 中的项数当然要与格式字符串中的插入点数相同。

    从 2.6 开始也可以使用新的format 方法,例如:

    x = '{} {}'.format(*s)
    

    【讨论】:

    • 随着 % 运算符在 python 3 中被弃用,您应该开始使用 format 方法:x = "{0} {1}".format(*s)join 在这种情况下当然是更好的解决方案..
    【解决方案2】:

    还有如何加入元组成员:

    x = " ".join(YourTuple)
    

    空格是你的元组成员分隔符

    【讨论】:

      【解决方案3】:

      在@yan 对较新的 .format 方法的回答的基础上,如果一个字典中有多个键值,请使用索引和键来访问不同的值。

      >>> s = {'first':['python','really'], 'second':'rocks'}
      >>> x = '{first[0]} --{first[1]}-- {second}'.format(**s)
      >>> x
      'python --really-- rocks'
      

      警告:当您必须针对独立于 .format() 的键访问其中一个值时,情况略有不同,如下所示:

      >>> value=s['first'][i]
      

      【讨论】:

        【解决方案4】:

        如果你想使用项目列表,你可以直接传递一个元组:

        s = ['Python', 'rocks']
        x = '%s %s' % tuple(s)
        

        或者您可以使用字典更早地列出您的列表:

        s = {'first':'python', 'second':'rocks'}
        x = '%(first)s %(second)s' % s
        

        【讨论】:

          【解决方案5】:

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

          >>> tup = (10, 20, 30)
          >>> lis = [100, 200, 300]
          >>> num = 50
          >>> print '%d      %s'%(i,tup)
          50      (10, 20, 30)
          >>> print '%d      %s'%(i,lis)
          50      [100, 200, 300]
          >>> print '%s'%(tup,)
          (10, 20, 30)
          >>> print '%s'%(lis,)
          [100, 200, 300]
          >>> 
          

          【讨论】:

            【解决方案6】:

            如果您认真考虑在格式中注入多达 26 个字符串,您可能需要考虑命名占位符。否则,查看您的代码的人会不知道s[17] 是什么。

            fields = {
                'username': 'Ghostly',
                'website': 'Stack Overflow',
                'reputation': 6129,
            }
            
            fmt = '''
            Welcome back to {website}, {username}!
            Your current reputation sits at {reputation}.
            '''
            
            output = fmt.format(**fields)
            

            可以肯定的是,您可以继续使用列表并将其扩展为Jochen Ritzel's answer, 的结尾,但对于较大的结构,这更难维护。我只能想象使用 26 个 {} 占位符会是什么样子。

            fields = [
                'Ghostly',
                'Stack Overflow',
                6129,
            ]
            
            fmt = '''
            Welcome back to {}, {}!
            Your current reputation sits at {}.
            '''
            
            output = fmt.format(*fields)
            

            【讨论】:

              【解决方案7】:

              我们可以使用带有列表名称的*list 转换为.format(...) 的参数。像这样:*mylist

              见以下代码:

              mylist = ['Harry', 'Potter']
              s = 'My last name is {1} and first name is {0}'.format(*mylist)
              print(s)
              

              输出:我的姓是波特,名字是哈利。

              【讨论】:

                【解决方案8】:

                检查以下示例

                列表示例

                data = ["John", "Doe", 53.44]
                format_string = "Hello"
                
                print "Hello %s %s your current balance is %d$" % (data[0],data[1],data[2])
                

                你好 John Doe,你目前的余额是 53 美元

                元组示例

                data = ("John", "Doe", 53.44)
                format_string = "Hello"
                
                print "Hello %s %s your current balance is %d$" % (data[0],data[1],data[2])
                

                你好 John Doe,你目前的余额是 53 美元

                【讨论】:

                  猜你喜欢
                  • 2017-11-03
                  • 2017-11-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-02-25
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多