Игнорировать KeyError и продолжить программу

В 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 do. Очевидно, что программа выбрала бы исключение KeyError, но я нейтрализовал это с помощью pass. Проблема заключается в том, что после выполнения кода pass программа завершает работу, и мне нужно, чтобы она продолжалась и выполняла цикл for на DIL. Как это сделать?

+4
источник поделиться
3 ответа

Почему бы и нет:

 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])   
+14
источник

поймать исключение в цикле

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)   
+4
источник

Вам просто нужно переместить блок try/except в цикл for.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос