You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:22:28