Python 2D列表匹配指定元素输出全部匹配结果问题求解
问题原因
你原来的代码出现两个问题的核心原因:
- 加
break时,只要匹配到第一个符合条件的子列表就直接终止循环,剩下的匹配项不会被遍历到,所以只会输出1条结果 - 去掉
break时,循环会完整遍历所有元素,没有被break中断,Python中for循环附带的else子句只要循环不是被break终止就会执行,所以不管有没有匹配到结果,都会触发重新输入的逻辑
修复方案
可以先收集所有匹配的条目,再根据是否有匹配结果决定要不要重新提示输入,参考代码如下:
listItem = [["Apple", "TP123", "67", "77"], ["Orange", "TP223", "55", "66"], ["Banana", "TP777", "98", "88"], ["Cherry", "TP123", "98", "88"]] def repeat(): tp = input("Please enter your tp: ") # 收集所有匹配的子列表 matched = [item for item in listItem if item[1] == tp] if matched: # 有匹配结果就逐行输出 for item in matched: print(item) else: # 无匹配就重新调用 repeat() # 调用函数 repeat()
如果不习惯用列表推导式,也可以用你原来的遍历写法调整,逻辑一致:
def repeat(): tp = input("Please enter your tp: ") has_matched = False for i in range(len(listItem)): if tp == listItem[i][1]: print(listItem[i]) has_matched = True if not has_matched: repeat()
拓展:更稳妥的循环写法(避免递归深度溢出)
如果担心用户多次输入错误触发递归深度超限,可以把递归换成while死循环,匹配到就退出循环即可:
listItem = [["Apple", "TP123", "67", "77"], ["Orange", "TP223", "55", "66"], ["Banana", "TP777", "98", "88"], ["Cherry", "TP123", "98", "88"]] while True: tp = input("Please enter your tp: ") matched = [item for item in listItem if item[1] == tp] if matched: for item in matched: print(item) break
内容的提问来源于stack exchange,提问作者Iris
相关产品推荐
相关产品推荐

