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を実行する必要があることです。どうすればよいですか?forDIL

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

編集:より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)   
于 2013-03-27T07:51:50.713 に答える
1

try/exceptブロックをforループに移動するだけです。

于 2013-03-27T07:51:39.130 に答える