Python 中如何通过元素操作实现列表相同值相邻排列
Python 列表同值元素相邻排列的实现方案
列表存在重复元素时,要让同值元素达成相邻排列的效果,可根据实际开发场景选择以下实现方式:
方案1:内置排序快速实现
只要列表元素支持比较操作,这是最简洁的实现路径,直接调用列表原生排序方法即可达成同值元素相邻的效果:
l = ['a','b','c','a','b','c'] l.sort() print(l) # 输出结果:['a', 'a', 'b', 'b', 'c', 'c']
注意:如果列表元素为自定义对象、或混合了无法直接比较的类型,内置排序会触发类型错误,这类场景请选择下面的非排序实现方案。
方案2:基于原地交换的归组实现
如果开发场景要求不能新建列表、只能通过元素交换调整原列表的位置,可先统计每个元素的出现频次,再按连续区间逐位置交换归位,完全匹配题目提到的交换操作要求:
from collections import Counter def group_in_place(lst): # 统计每个元素的出现次数 element_count = Counter(lst) cursor = 0 # 为每个元素分配连续的存放区间 for val, total in element_count.items(): interval_start = cursor interval_end = cursor + total # 遍历区间内的每个位置,将匹配元素交换到位 for idx in range(interval_start, interval_end): if lst[idx] != val: # 向后查找目标值完成交换 swap_pos = idx + 1 while lst[swap_pos] != val: swap_pos += 1 lst[idx], lst[swap_pos] = lst[swap_pos], lst[idx] cursor = interval_end return lst # 测试调用 l = ['a','b','c','a','b','c'] print(group_in_place(l)) # 输出结果:['a', 'a', 'b', 'b', 'c', 'c']
方案3:计数展开生成新列表
如果允许生成新的列表对象,这种方法的执行效率最高,不需要复杂的位置查找和交换逻辑:
from collections import Counter l = ['a','b','c','a','b','c'] count_result = Counter(l) grouped_list = [val for val, count in count_result.items() for _ in range(count)] print(grouped_list) # 输出结果:['a', 'a', 'b', 'b', 'c', 'c']
补充说明:以上所有方案默认按照元素本身的排序/首次出现顺序安排相邻组的先后位置,如果对组的顺序有自定义要求,只需要调整遍历计数结果的顺序即可。
内容的提问来源于stack exchange,提问作者Ram dr
相关产品推荐
相关产品推荐

