如何遍历匹配两个2D数组,实现元素的正确/错误分类?
问题解决:二维数组元素匹配
给定数组
mix = [[1,'Blue'],[2,'Black'],[3,'Black'],[4,'Red']] possibilities = [[1,'Black'],[1,'Red'],[1,'Blue'],[1,'Yellow'], [2,'Green'],[2,'Black'], [3,'Black'],[3,'Pink'], [4,'White'],[4,'Blue'],[4,'Yellow'], [5,'Purple'],[5,'Blue'] ]
需求
遍历possibilities数组,找到与mix数组中元素完全匹配的项,将匹配项加入correct_guess列表;若mix中的元素在possibilities中无匹配,则加入bad_guess列表。
尝试的错误代码
i = 0 j = 0 bad_guess = [] correct_guess = [] while i < len(mix): while possibilities[j] != mix[i]: j += 1 if possibilities[j] == mix[i]: i +=1 correct_guess.append(possibilities[j]) j = 0 elif possibilities[j] != mix[i]: bad_guess.append(mix[i]) break
期望输出说明
原期望输出存在笔误([5,'Purple']不属于mix数组,不应出现在结果中),正确期望输出应为:
correct_guess = [[1,'Blue'],[2,'Black'],[3,'Black']] bad_guess = [[4,'Red']]
错误代码问题分析
- 索引越界风险:当
mix中的元素不在possibilities中时,内层while循环会持续递增j,直到超出数组索引范围触发IndexError。 - 逻辑分支无效:内层
while循环仅会在找到匹配项时退出,因此后续的elif分支永远不会执行。 - 遍历逻辑混乱:嵌套
while的设计无法正确遍历所有可能的匹配情况,一旦遇到不匹配项就会陷入死循环或直接终止程序。
正确解法
方法1:直接遍历判断
遍历mix中的每个元素,直接检查是否存在于possibilities中,按结果分类:
bad_guess = [] correct_guess = [] for item in mix: if item in possibilities: correct_guess.append(item) else: bad_guess.append(item) print("correct_guess =", correct_guess) print("bad_guess =", bad_guess)
方法2:集合优化查找效率
由于列表的in操作时间复杂度为O(n),将possibilities转换为元组集合(列表不可哈希,无法直接存入集合),可将查找时间降至O(1),适合处理大规模数据:
bad_guess = [] correct_guess = [] # 将possibilities中的列表转为元组,存入集合加速查找 poss_set = set(tuple(p) for p in possibilities) for item in mix: if tuple(item) in poss_set: correct_guess.append(item) else: bad_guess.append(item) print("correct_guess =", correct_guess) print("bad_guess =", bad_guess)
最终输出
运行上述代码后,输出结果为:
correct_guess = [[1, 'Blue'], [2, 'Black'], [3, 'Black']] bad_guess = [[4, 'Red']]
内容的提问来源于stack exchange,提问作者Romain_NewPython
相关产品推荐
相关产品推荐

