Python检查列表元素是否存在于另一列表并生成匹配结果列表
问题场景
现有两个列表(注意原示例中y列表的"ooo"后误写为句点,修正为逗号):
x = ["abc", "def", "ghi"] y = ["ggg", "hhh", "abc", "yyy", "ttt", "uuu", "ooo", "def", "www", "xxx"]
需要生成新列表match:遍历x中每一个元素,若该元素存在于y则追加"Present",不存在则追加"Not Found",预期输出为:
match = ["Present", "Present", "Not Found"]
原有代码错误分析
你之前的三种实现都错误使用了嵌套循环,导致结果不符合预期:
- 第一种写法:内层循环找到匹配项时会追加
"Present",但无论是否找到匹配,内层循环结束后都会无条件追加一次"Not Found",最终列表会出现多余值,长度与x不一致。 - 第二种写法:内层循环每完成一次元素对比就追加一次结果,最终会生成
len(x)*len(y)个元素,远超出预期长度。 - 第三种写法:分两轮嵌套循环,第一轮找到匹配就追加
"Present",第二轮只要对比不匹配就追加"Not Found",会生成大量重复冗余值。
正确实现方案
不需要写两层嵌套循环,Python原生支持in关键字直接判断元素是否存在于序列中,逻辑简单不易出错。
- 基础循环写法:
match = [] for item in x: if item in y: match.append("Present") else: match.append("Not Found")
- 简洁列表推导式写法:
match = ["Present" if item in y else "Not Found" for item in x]
- 大列表性能优化写法:
如果两个列表长度很大,列表的in操作时间复杂度为O(n),可以先将y转为集合,把查询时间复杂度降到O(1),大幅提升运行效率:
y_set = set(y) match = ["Present" if item in y_set else "Not Found" for item in x]
以上三种写法运行后都能得到你预期的match列表。
内容的提问来源于stack exchange,提问作者user13024918
相关产品推荐
相关产品推荐

