2013-03-27 138 views
4

在Python 3中,我有一個程序編碼如下。它基本上接受用戶的輸入並根據字典(EXCHANGE_DATA)進行檢查並輸出信息列表。忽略KeyError並繼續執行程序

from shares import EXCHANGE_DATA 
portfolio_str=input("Please list portfolio: ") 
portfolio_str= portfolio_str.replace(' ','') 
portfolio_str= portfolio_str.upper() 
portfolio_list= portfolio_str.split(',') 
print() 
print('{:<6} {:<20} {:>8}'.format('Code', 'Name', 'Price')) 
EXCHANGE_DATA = {code:(share_name,share_value) for code, share_name, share_value in EXCHANGE_DATA} 
try: 
    for code in portfolio_list: 
       share_name, share_value = EXCHANGE_DATA[code] 
       print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value)) 
except KeyError: 
    pass 

示例輸入: GPG,HNZ,DIL,FRE

輸出如下:

Please list portfolio: GPG,HNZ,DIL,FRE 

Code Name     Price 
GPG Guinnesspeat   2.32 
HNZ Heartland Nz   3.85 
DIL Diligent    5.30 
FRE Freightway    6.71 

但是,如果我有等的輸入:

AIR,HNZ,AAX,DIL,AZX

其中術語AAX,AZX不存在於字典(EXCHANGE_DATA),但條款AIR,HNZ,DIL做。該計劃顯然會拋出KeyError例外,但我用pass抵消了這一點。問題是執行了pass代碼後,程序退出,我需要它繼續並在DIL上執行for循環。我該怎麼做呢?

回答

13

爲什麼不:

for code in portfolio_list: 
    try: 
     share_name, share_value = EXCHANGE_DATA[code] 
     print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value) 
    except KeyError: 
     continue 

或檢查dict.get方法:

for code in portfolio_list: 
    res = EXCHANGE_DATA.get(code, None) 
    if res: 
     print('{:<6} {:<20} {:>8.2f}'.format(code, *res) 

正如@RedBaron提到:

for code in portfolio_list: 
    if code in EXCHANGE_DATA: 
     print('{:<6} {:<20} {:>8.2f}'.format(code, *EXCHANGE_DATA[code]) 
+0

你是真棒。謝謝 – jevans 2013-03-27 07:53:17

+1

只需使用'pass'即可在此工作。 – 2013-03-27 07:53:33

+0

@jevans歡迎你 – 2013-03-27 07:54:09

1

你只需要移動try/except阻止進入for循環。

4

抓在循環異常

for code in portfolio_list: 
    try: 
     share_name, share_value = EXCHANGE_DATA[code] 
     print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value) 
    except KeyError: 
     pass 

編輯:更Python的方式將是檢驗如果dict有元素第一

for code in portfolio_list: 
    if code in EXCHANGE_DATA: 
     share_name, share_value = EXCHANGE_DATA[code] 
     print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value) 
+0

這絕對不是更爲pythonic的方式,許多pythonistas會更喜歡第一個,因爲要求寬恕而不是允許。 http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#eafp-vs-lbyl – jamylak 2013-03-27 08:22:55

+1

http://stackoverflow.com/questions/4512557/python-if-key-in-dict -vs-try- – RedBaron 2013-03-27 08:26:21

+0

@RedBaron我不同意,這種情況也略有不同,無論如何pythonic這個詞沒有明確的定義。 – jamylak 2013-03-27 08:56:35