繁体   English   中英

用元组列表进行字符串格式化?

[英]String formatting with a list of tuples?

我正在尝试使用带元组列表的字符串格式化,其格式如下:

formulas_and_labels = [('formula1', 'label1'),
                       ('formula2', 'label2')]

这应该用于格式化以下字符串:

SQL_string = """SELECT 
                      {}      AS "{}", 
                      {}      AS "{}"

                FROM   
                schema.table""".format(*formulas_and_labels)

我知道这会产生IndexError: tuple index out of range ,因为(*formulas_and_labels)仅包含两个元素(元组),而字符串则需要4个元素(4x {})。

我设法找到解决方法,方法是先使用

formulas_and_labels_unpacked = [v for t in formulas_and_labels for v in t]

(在这里找到)。

但是,我想知道是否存在更直接的方法,例如使用.format(*el) for el in formulas_and_labels) .format(**formulas_and_labels).format(*el) for el in formulas_and_labels)类的方法直接“双重解压缩”列表和元组?

您只需要明确指出要指代的序列项,例如:

formulas_and_labels = [('formula1', 'label1'), ('formula2', 'label2')]

SQL_string = """SELECT
                      {0[0]}      AS "{0[1]}",
                      {1[0]}      AS "{1[1]}"

                FROM
                schema.table""".format(*formulas_and_labels)

print(SQL_string)

输出:

SELECT
                      formula1      AS "label1",
                      formula2      AS "label2"

                FROM
                schema.table

可以将其通用化,以根据formulas_and_labels列表中有多少对值即时创建所需的格式字符串,以处理可变数量的公式和标签:

# Generalized
formulas_and_labels = [('formula1', 'label1'),
                       ('formula2', 'label2'),
                       ('formula3', 'label3')]

SQL_string = """SELECT
                      {}

                FROM
                schema.table"""

SELECT_string = '{{{0}[0]}}      AS "{{{0}[1]}}"'
selects = ',\n                      '.join(SELECT_string.format(i)
                                                for i in range(len(formulas_and_labels)))

print(SQL_string.format(selects.format(*formulas_and_labels)))

输出:

SELECT
                      formula1      AS "label1",
                      formula2      AS "label2",
                      formula3      AS "label3"

                FROM
                schema.table

与其将公式和标签成对保存在元组中,不如将它们保存在字典中:

formulas_and_labels = {"formula1" : "1", "label1": "1a",
                       "formula2": "2", "label2": "2a"
                       }

然后,如果占位符正确命名,则可以使用您询问的.format(**formulas_and_labels)表示法:

SQL_string = """SELECT 
                       {formula1}      AS "{label1}",
                       {formula2}      AS "{label2}"

                 FROM   
                 schema.table"""

鉴于这种:

>>> print(SQL_string.format(**formulas_and_labels))
SELECT 
                      1      AS "1a",
                      2      AS "2a"

                FROM   
                schema.table

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM