2017-05-04 85 views
0

我試圖使用格式化字符串元組的列表,其中有以下形式:使用元組列表進行字符串格式化?

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] 

(發現here)列表,找到一個解決辦法。

但是,我想知道是否存在一種更直接的方式來直接使用.format(**formulas_and_labels).format(*el) for el in formulas_and_labels)之類的東西直接「解開」列表和元組?

+2

您的預期輸出是什麼? –

+1

是您的最終查詢應該是'SELECT'子句中的2個屬性的硬編碼長度? –

回答

1

你一定要明確告知你指的是什麼順序的項目,如:

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 
0

而是保存配方和標籤成對的元組,你可以改爲保存「時間在詞典:

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