项目介绍:
给定
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变量来告诉计算机要跳出循环。