【问题标题】:Python 3 Nested try exceptions for keys in dictionariesPython 3 字典中键的嵌套尝试异常
【发布时间】:2014-09-26 14:33:28
【问题描述】:

有没有处理不存在的字典键的好方法?

我有一个基于字典的数据库,其中的键看起来像这样

ID
   ver
      sub_ver
           A
           B
           C

我想比较每个 ID/ver/sub_ver 的 A、B、C 键的值,以确保:

 (A==B and C==None) or (A==C and B==None) or (A==B==C)

但并非所有“ID”都有 A 和 B 以及 C 键/值

我的代码不是很好:

**loops outside of this for ID/ver/sub_ver** 
try:
    A = data_structure[ID][ver][sub_ver]['A']
    B = data_structure[ID][ver][sub_ver]['B']
    C = data_structure[ID][ver][sub_ver]['C']
except KeyError:
    try:
        A = data_structure[ID][ver][sub_ver]['A']
        B = data_structure[ID][ver][sub_ver]['B']
        C = None

    except KeyError: 
        try:
            A = data_structure[ID][ver][sub_ver]['A']
            B = None
            C = data_structure[ID][ver][sub_ver]['C']                    

接下来我检查所有值是否匹配

我使用 set() 以防 A/B/C 列表不按顺序排列

if not any((set(A)==set(B) and C==None, \
            set(A)==set(C) and B==None, \
            set(A)==set(B)==set(C))):
    set_of_problems.append([ID, ver, sub_ver, [A, B, C])

当涉及到字典中不存在的键时,是否有更好的方法来执行嵌套的 try/except ?

【问题讨论】:

标签: python dictionary key try-catch


【解决方案1】:

你有太多try的;使用dict.get() 获取可选元素:

try:
    A = data_structure[ID][ver][sub_ver]['A']
except KeyError:
    # no A so error, next iteration of your loop
    continue

# we know ID, ver, and sub_ver all are present
B = data_structure[ID][ver][sub_ver].get('B')
C = data_structure[ID][ver][sub_ver].get('C')

if (C is None and A == B) or (B is None and A == C) or (A == B == C):

【讨论】:

  • 啊 .get() 好用!此外,为了处理列表中的值,我将默认值添加到 get-functions .get('B', [None]) 并将 C is None 更改为 C==[None]
  • @user2987193: 你需要使用set() 这是一个单独的问题;它对原始问题和该问题的解决方案没有影响。
猜你喜欢
  • 1970-01-01
  • 2015-05-09
  • 2017-01-20
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多