忽略KeyError并继续编程

jev*_*ans 9 python dictionary python-3.x

在Python 3中,我有一个编程如下的程序.它基本上接受来自用户的输入并根据字典(EXCHANGE_DATA)进行检查并输出信息列表.

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
Run Code Online (Sandbox Code Playgroud)

输入示例: 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
Run Code Online (Sandbox Code Playgroud)

但如果我有一个输入,如:

AIR,HNZ,AAX,DIL,AZX

其中术语AAX,AZX不存在于字典(EXCHANGE_DATA),但条款AIR,HNZ,DIL做.该程序显然会引发KeyError异常,但我已将其中和pass.问题是pass代码执行后程序退出,我需要它继续执行for循环DIL.我该怎么做呢?

Art*_*nka 22

为什么不:

 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
Run Code Online (Sandbox Code Playgroud)

或检查dict.get方法:

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

正如@RedBaron所说:

 for code in portfolio_list:
     if code in EXCHANGE_DATA:
         print('{:<6} {:<20} {:>8.2f}'.format(code, *EXCHANGE_DATA[code])   
Run Code Online (Sandbox Code Playgroud)


xua*_*nji 5

捕获循环中的异常

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
Run Code Online (Sandbox Code Playgroud)

编辑:更Pythonic的方法是首先测试字典是否有该元素

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)   
Run Code Online (Sandbox Code Playgroud)