第一次使用try...except来解决问题,break深化理解——基于一个具体项目

项目介绍:

给定

    from typing import List
    def remove_party(rank_ballots: List[List[str]], party_to_remove: str) -> None:

作用

    '''
    >>> party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], \
                ['CPC', 'NDP', 'LIBERAL', 'GREEN'], \
                ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
    >>> remove_party(party, 'NDP')
    >>> party
    [['LIBERAL', 'GREEN', 'CPC'], ['CPC', 'LIBERAL', 'GREEN'], \
['CPC', 'GREEN', 'LIBERAL']]
    '''

求:

    party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], ['CPC', 'NDP', 'LIBERAL', 'GREEN'], ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
    remove_party(party, 'NDP')

错误代码

    from typing import List
    def remove_party(rank_ballots: List[List[str]], party_to_remove: str) -> None:
        flag = False
        for l in rank_ballots:
            if l[3] == party_to_remove:
                l.pop()
            else:
                for i in range(3):
                    if l[i] == party_to_remove:
                        for k in range(i, 3):
                            l[k] = l[k + 1]
                            l.pop()
                            flag = True
                    if flag == True: break
            print(l)
    party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], ['CPC', 'NDP', 'LIBERAL', 'GREEN'], ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
    remove_party(party, 'NDP')

返回

['LIBERAL', 'GREEN', 'CPC']
Traceback (most recent call last):
  File "D:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3437, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-e84d3a03c906>", line 17, in <module>
    remove_party(party, 'NDP')
  File "<ipython-input-10-e84d3a03c906>", line 11, in remove_party
    l[k] = l[k + 1]
IndexError: list index out of range

解析原因:list index out of range

主要原因有2个:

1. 下标超出范围

2. list为空

用try...except找原因:

from typing import List
def remove_party(rank_ballots: List[List[str]], party_to_remove: str) -> None:
    flag = False
    for l in rank_ballots:
        try:
            if l[3] == party_to_remove:
                l.pop()
            else:
                for i in range(3):
                    if l[i] == party_to_remove:
                        for k in range(i, 3):
                            l[k] = l[k + 1]
                            l.pop()
                            flag = True
                    if flag == True: break
            print(l)
        except:
            print('hh')
party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], ['CPC', 'NDP', 'LIBERAL', 'GREEN'], ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
remove_party(party, 'NDP')

返回

['LIBERAL', 'GREEN', 'CPC']
hh
hh

说明

这一块有问题

原来是l.pop()有问题,不应该缩进的(按回车的时候没有注意)

改一下

    from typing import List
    def remove_party(rank_ballots: List[List[str]], party_to_remove: str) -> None:
        flag = False
        for l in rank_ballots:
            try:
                if l[3] == party_to_remove:
                    l.pop()
                else:
                    for i in range(3):
                        if l[i] == party_to_remove:
                            for k in range(i, 3):
                                l[k] = l[k + 1]
                            l.pop()
                            flag = True
                        if flag == True: break
                print(l)
            except:
                print('hh')
    party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], ['CPC', 'NDP', 'LIBERAL', 'GREEN'], ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
    remove_party(party, 'NDP')

 返回

['LIBERAL', 'GREEN', 'CPC']
['CPC', 'LIBERAL', 'GREEN']
['CPC', 'GREEN', 'LIBERAL']

【注意】

为什么要用flag整个布尔值变量,因为剔除最后一个元素后,应该跳出循环,否则会继续剔除变成空列表,仍然会出现list index out of range问题。l.pop()相当于一个信号,告诉我们要停止循环。于是用flag变量来告诉计算机要跳出循环。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值