17

在 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

示例输入: 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代码执行后程序退出,我需要它继续并执行for循环DIL。我该怎么做呢?

4

3 回答 3

31

为什么不:

 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])   
于 2013-03-27T07:50:35.487 回答
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

编辑:更pythonic的方法是测试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)   
于 2013-03-27T07:51:50.713 回答
1

您只需将try/except块移动到 for 循环中。

于 2013-03-27T07:51:39.130 回答