Python如何从关联列表中删除符合指定条件的对应元素
问题背景
现有两个一一对应的平行关联列表:
Names:存储人员姓名Fees:存储同索引位置人员的缴费状态,"y"代表已缴费,"n"代表未缴费
需求为移除所有未缴费人员对应的姓名、缴费状态条目。原有实现代码运行时会触发索引越界,且删除结果不符合预期,原代码如下:
Names = ["a","b","c","d","e","f"] Fees = ["n","y","y","y","n","y"] print("Names:",Names) print("Fees paid:",Fees) for i in range (0,len(Fees)): if Fees[i] == "n": del(Names[i]) del(Fees[i]) print("Names:",Names) print("Fees paid:",Fees)
错误原因
原代码的核心问题是正向遍历列表的同时动态删除列表元素:
range(0,len(Fees))在循环启动时就会按照初始列表长度生成固定的索引序列,删除元素后列表实际长度变短,遍历到后面就会出现索引超出当前列表长度的越界错误。- 删除某索引位置的元素后,该位置后面的所有元素都会向前移位,下一轮循环遍历下一个索引时,会直接跳过原本移位到当前索引位置的元素,导致漏判。
正确实现方案
方案1:倒序遍历删除
从列表末尾往头部方向遍历,此时删除元素只会影响已经遍历过的后部索引,不会干扰还未遍历的前部元素位置,不会出现漏判和越界:
Names = ["a","b","c","d","e","f"] Fees = ["n","y","y","y","n","y"] print("Names:",Names) print("Fees paid:",Fees) # 从最后一个索引倒序遍历到索引0 for i in range(len(Fees)-1, -1, -1): if Fees[i] == "n": del Names[i] del Fees[i] print("Names:",Names) print("Fees paid:",Fees)
运行输出:
Names: ['a', 'b', 'c', 'd', 'e', 'f'] Fees paid: ['n', 'y', 'y', 'y', 'n', 'y'] Names: ['b', 'c', 'd', 'f'] Fees paid: ['y', 'y', 'y', 'y']
方案2:列表推导式过滤(推荐写法)
Python中更推荐不直接修改原列表,而是通过配对过滤生成新列表,逻辑更清晰,完全避免遍历修改原列表的坑:
Names = ["a","b","c","d","e","f"] Fees = ["n","y","y","y","n","y"] print("Names:",Names) print("Fees paid:",Fees) # 打包同索引的姓名和缴费状态,过滤出已缴费的配对 paid_records = [item for item in zip(Names, Fees) if item[1] == "y"] # 拆分回两个列表 Names, Fees = list(zip(*paid_records)) print("Names:",Names) print("Fees paid:",Fees)
运行结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者Mr mac
相关产品推荐
相关产品推荐

