如何创建无值但算作元素的列表项,排序时置于列表末尾
实现含无值占位元素的列表并保证排序时占位元素在末尾
核心需求实现
1. 创建无值占位元素
直接用Python的None作为无值占位符,它会被视为列表的合法元素,比如你需要的[1, 2, None]就对应你描述的[1,2,_]形式。
2. 排序时让占位元素排在末尾
通过自定义排序规则实现:给sort()方法传入key参数,将元素转换为元组(e is None, e)。因为布尔值False(对应非None元素)小于True(对应None元素),所以非None元素会按自身值排序在前,所有None元素统一排在末尾。
示例代码:
# 创建包含占位元素的列表 nums = [3, None, 1, 2, None, 5] # 自定义排序 nums.sort(key=lambda e: (e is None, e)) print(nums) # 输出: [1, 2, 3, 5, None, None]
对你提供的去重代码的分析与改进
你给出的removeDuplicates代码存在逻辑和功能上的问题:
- 嵌套循环+中途排序会打乱索引,导致后续循环处理错误
- 返回
set(nums)不符合题目要求(题目通常要求返回有效元素个数,且set会丢失顺序并自动移除None) - 时间复杂度高,效率低下
改进后的代码(满足原地修改、去重、保留None占位且排序后None在末尾):
from typing import List class Solution: def removeDuplicates(self, nums: List[int]) -> int: # 收集不重复的有效元素 seen = set() unique_elements = [] for num in nums: if num not in seen and num is not None: seen.add(num) unique_elements.append(num) # 统计原列表中的None数量并添加到末尾 none_count = nums.count(None) unique_elements.extend([None] * none_count) # 排序保证None在末尾 unique_elements.sort(key=lambda e: (e is None, e)) # 原地修改原列表 nums[:] = unique_elements # 返回去重后的有效元素个数(不含None) return len(seen)
测试示例:
sol = Solution() test_nums = [1, 2, 2, 3, None, 1, None] result_length = sol.removeDuplicates(test_nums) print(test_nums) # 输出: [1, 2, 3, None, None] print(result_length) # 输出: 3
内容的提问来源于stack exchange,提问作者KARTX LEGEND YT
相关产品推荐
相关产品推荐

