如何将Python列表按元素首数字分组,仅保留元素数量>1的子列表?
解决将列表分组为同首数字且元素数>1的子列表问题
要把列表 a = [58,23,12,24,11,63,54] 转换成符合要求的子列表集合,核心思路就是按首数字分组,再过滤掉元素数量不足2的分组,同时还要保证子列表的顺序和原列表中首数字首次出现的顺序一致(和你给出的结果顺序匹配)。
方法一:使用collections.defaultdict(简洁高效)
from collections import defaultdict a = [58,23,12,24,11,63,54] # 第一步:按首数字分组 grouped = defaultdict(list) for num in a: # 对于两位数,用整除10快速获取首数字;兼容多位数的话可以用int(str(num)[0]) first_digit = num // 10 grouped[first_digit].append(num) # 第二步:按原列表中首数字出现顺序收集符合条件的子列表 result = [] seen_digits = set() for num in a: first_digit = num // 10 if first_digit not in seen_digits: seen_digits.add(first_digit) current_group = grouped[first_digit] if len(current_group) > 1: result.append(current_group) print(result) # 输出: [[58,54],[23,24],[12,11]]
方法二:不用额外库,纯基础字典实现
如果不想引入collections,用普通字典也能完成:
a = [58,23,12,24,11,63,54] grouped = {} for num in a: first_digit = num // 10 # 字典中没有该首数字的键时,创建空列表 if first_digit not in grouped: grouped[first_digit] = [] grouped[first_digit].append(num) # 同样按原顺序收集结果 result = [] seen = set() for num in a: fd = num // 10 if fd not in seen: seen.add(fd) group = grouped[fd] if len(group) > 1: result.append(group) print(result) # 输出和上面一致
关键细节说明
- 首数字提取:上面用
num//10是针对两位数的最优解,如果你的列表里有一位数或者更多位数的数字,建议换成通用写法:int(str(num)[0]),这样不管数字是几位数都能正确提取首数字。 - 子列表顺序:如果不关心子列表的顺序,只需要结果正确,也可以直接过滤字典的值:
result = [g for g in grouped.values() if len(g) > 1],但这样输出的顺序会是按首数字从小到大排列(比如[[12,11],[23,24],[58,54]]),和题目要求的顺序不符,所以才需要额外遍历原列表来保持顺序。
内容的提问来源于stack exchange,提问作者Sai Krishna Maddali
相关产品推荐
相关产品推荐

