2016-12-27 85 views
-1

隨着下面的字典,我試圖實現字符串的創建。嵌套字典和循環內的python字符串格式

query_args= {"columns":{ "investingcom":"datetime, actual, forecast, previous", 
         "bloomberg":"datetime, Actual, `Surv(M)`, Prior", 
         "ft":"datetime, actual, forecast, prior"}, 
      "table":{"investingcom":"`all-data`.`indicators`", 
        "bloomberg":"`all-data`.`indicators-bloomberg`", 
         "ft":"`all-data`.indicators_ft"}, 
      "country":{"investingcom":"\"US\"", 
        "bloomberg":"\"US\"", 
         "ft":"\"United States\""}, 
      "name":{"investingcom":"\"Average Hourly Earnings (MoM)\"", 
        "bloomberg":"\"Average Hourly Earnings MoM\"", 
         "ft":"\"Average Hourly Earnings %% m/m\""} 
        } 

有3串,我需要創造,因此,對於循環使用的:

for ind_source in ["investingcom", "bloomberg", "ft"]: 
    print('SELECT {columns[ind_source]} FROM {table[ind_source]} \ 
    WHERE country={country[ind_source]} AND name={name[ind_source]}'.format(**query_args)) 

然而,這會返回一個錯誤:

KeyError: 'ind_source' 

任何建議如何使執行成功?

回答

1

我不熟悉,做它,你在你的例子嘗試(儘管有可能做到這一點與一些調整這樣的方式。然而,我會做的方式是類似如下:

query_args= {"columns":{ "investingcom":"datetime, actual, forecast, previous", 
         "bloomberg":"datetime, Actual, `Surv(M)`, Prior", 
         "ft":"datetime, actual, forecast, prior"}, 
      "table":{"investingcom":"`all-data`.`indicators`", 
        "bloomberg":"`all-data`.`indicators-bloomberg`", 
         "ft":"`all-data`.indicators_ft"}, 
      "country":{"investingcom":"\"US\"", 
        "bloomberg":"\"US\"", 
         "ft":"\"United States\""}, 
      "name":{"investingcom":"\"Average Hourly Earnings (MoM)\"", 
        "bloomberg":"\"Average Hourly Earnings MoM\"", 
         "ft":"\"Average Hourly Earnings %% m/m\""} 
        } 

for ind_source in ["investingcom", "bloomberg", "ft"]: 
    print('SELECT {} FROM {} \ 
    WHERE country={} AND name={}'.format(
     query_args['columns'][ind_source], 
     query_args['table'][ind_source], 
     query_args['country'][ind_source], 
     query_args['name'][ind_source], 
    )) 
0

如何:

for ind_source in ["investingcom", "bloomberg", "ft"]: 
    print(('SELECT {columns[' +ind_source + ']} FROM {table[' + ind_source + ']} \ 
    WHERE country={country[' + ind_source + ']} AND name={name[' + ind_source + ']}').format(**query_args)) 

如果你把'ind_source'字符串,裏面格式化它將在query_args字典的關鍵'ind_source'搜索時。這本詞典沒有那個鍵,所以那個錯誤。 而不是在for循環中將字符串與當前值ind_source連接起來。

+0

感謝您的回覆。但是,現在我收到以下錯誤:'單個'}'遇到格式字符串' –

+0

您仍然需要修復最後一個鍵(名稱) –

+0

您是對的,已編輯! –

1

我會嘗試以下方法:

for ind_source in ["investingcom", "bloomberg", "ft"]: 
    print(
     ("SELECT {columns[%(ind_source)s]} FROM {table[%(ind_source)s]}" 
      "WHERE country={country[%(ind_source)s]} AND " 
      "name={name[%(ind_source)s]}" % { 'ind_source': ind_source }) 
    .format(**query_args)) 

實質上是使用連續進行了兩場format操作,以獲得您想要的查詢

0

相反tryi的如果要執行復雜的格式,請先嚐試過濾數據以獲得更清晰的格式字符串和可讀性。

query_args= {"columns":{ "investingcom":"datetime, actual, forecast, previous", 
         "bloomberg":"datetime, Actual, `Surv(M)`, Prior", 
         "ft":"datetime, actual, forecast, prior"}, 
      "table":{"investingcom":"`all-data`.`indicators`", 
        "bloomberg":"`all-data`.`indicators-bloomberg`", 
         "ft":"`all-data`.indicators_ft"}, 
      "country":{"investingcom":"\"US\"", 
        "bloomberg":"\"US\"", 
         "ft":"\"United States\""}, 
      "name":{"investingcom":"\"Average Hourly Earnings (MoM)\"", 
        "bloomberg":"\"Average Hourly Earnings MoM\"", 
         "ft":"\"Average Hourly Earnings %% m/m\""} 
        } 

for ind_source in ["investingcom", "bloomberg", "ft"]: 
    args = {x: query_args[x][ind_source] for x in query_args} 
    print('SELECT {columns} FROM {table} \ 
    WHERE country={country} AND name={name}'.format(**args))