【问题标题】:Handle exceptions while iterating over a dictionary遍历字典时处理异常
【发布时间】:2016-06-25 17:05:39
【问题描述】:

我正在搜索文本以提取一些数据,当我什么也没找到时我需要处理这种情况:

items = {'item_1':['----']*len(some_text),
         'item_2':['----']*len(some_text),
         'item_3':['----']*len(some_text)]

for i, data in enumerate(some_text):
    try:
        items['item_1'][i] = re.findall('regex_1',data)[0]
    except (IndexError):
        pass
    try:
        items['item_2'][i] = re.findall('regex_2',data)[0]
    except (IndexError):
        pass
    try:
        items['item_3'][i] = re.findall('regex_2',data)[0]
    except (IndexError):
        pass

我是这样做的,而不是这样:

for i, data in enumerate(some_text):
    try:
        items['item_1'][i] = re.findall('regex_1',data)[0]
        items['item_2'][i] = re.findall('regex_2',data)[0]
        items['item_3'][i] = re.findall('regex_2',data)[0]
    except (IndexError):
        pass

因为在最后一种情况下,如果只有一个搜索失败,我将丢失所有数据,但我重复了很多代码。

编辑。

我的预期结果是有一个包含大多数项目的字典。

例如,如果:

item_1 是一个地址
item_2 是一个名字
item_3 是校准

如果在搜索地址时发生异常,我仍然希望能够获取名称和校准。我也不想处理异常,所以如果需要我可以输入“未找到”之类的消息

【问题讨论】:

  • 为什么没有regex_3
  • 如果任何搜索失败,您是否不希望它失败,或者您是否有理由仍想捕获您可以捕获的任何数据?
  • 那么你的问题是什么?如果任何搜索失败,您可能应该解释预期结果应该是什么样子,因为在任一版本的代码中,都不会附加相应的列表,并且下一次迭代将产生IndexError
  • 我认为 OP 想忽略任何 IndexError 并继续执行代码,就好像没有抛出异常一样。
  • 但是他需要指定如何构造一个不包含所有元素的列表。要么他需要插入某种空匹配,要么他最终得到长度不可预见的列表,在这种情况下,他不能简单地分配给[i],而是需要append()

标签: python dictionary exception-handling


【解决方案1】:

我认为避免重复代码的方法是使用循环。首先,将您的字典键和正则表达式对打包成可迭代的东西,然后遍历这些对。下面是使用字典作为键和正则表达式的样子(但 2 元组列表也可以正常工作):

key_regex_dict = {'item_1': 'regex_1', 'item_2': 'regex_2', 'item_3': 'regex_3'}
for i, data in enumerate(some_text):
    for key, regex in key_regex_dict.items():
        try:
            items[key][i] = re.findall(regex, data)[0]
        except IndexError:
            pass

【讨论】:

    猜你喜欢
    • 2023-01-14
    • 1970-01-01
    • 2017-09-16
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多