Python列表去重后升序返回的代码优化及实现方法咨询
问题描述
我最近刚开始学习for循环以及lists(列表)的使用,刚完成了一道布置的练习题,过程中觉得难度较高。我想把这道题和我的实现方案分享给大家,希望大家能给我一些代码优化的建议,或是提供其他解决该问题的思路,感谢大家的帮助。我刚接触编程和Stack Overflow,若有操作不当还请见谅。
题目要求
编写一个接收自然数列表的函数,校验该列表是否存在重复数字,若存在则移除重复项。函数最终需要返回无重复元素的对应列表,且返回的列表需按升序排列。
我的实现代码
def remove_repeated_numbers(z): x = 1 for i in z: y = x while y <= (len(z) - 1): if i == z[y]: del z[y] y = (y - 1) #Once z[y] is deleted, should check same spot again y = (y + 1) x = (x + 1) list_finished = sorted(z[:]) return list_finished def main(): run = True z = [] while run: u = int(input("Entry value: ")) if u != 0: z.append(u) else: run = False print(remove_repeated_numbers(z)) main()
优化建议
- 你当前的代码功能是可以正常跑通的,但存在两个可优化的点:一是直接修改传入的原列表,会产生隐含副作用,如果函数调用方后续还要使用原始输入列表,数据就会被破坏;二是两层嵌套循环的时间复杂度为O(n²),当列表元素量很大的时候运行效率会很低。
- 针对去重+升序输出的需求,Python有非常简洁的实现方式,利用集合(set)天然去重的特性,搭配sorted方法一行就能完成核心逻辑:
def remove_repeated_numbers(z): return sorted(set(z))
- 如果你希望自己实现去重逻辑、不直接依赖set的特性,可以用额外集合存储已出现的元素,仅需一次遍历就能完成去重,时间复杂度降到O(n):
def remove_repeated_numbers(z): seen = set() result = [] for num in z: if num not in seen: seen.add(num) result.append(num) return sorted(result)
- main函数也可以简化,不需要单独声明run变量,直接用while True加break逻辑更清晰,额外加上
if __name__ == "__main__"是Python的通用最佳实践,避免脚本被其他文件导入时自动执行main函数:
def main(): z = [] while True: u = int(input("Entry value: ")) if u == 0: break z.append(u) print(remove_repeated_numbers(z)) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者fabinfabinfabin
相关产品推荐
相关产品推荐

