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

如何高效查找嵌套列表中跨子列表重复元素及其索引?

高效查找嵌套列表中跨子列表的重复元素位置

你之前用多层循环慢太正常了——这种方法相当于每个元素都要和其他所有元素挨个比对,时间复杂度是O(n²),数据量大的时候肯定拖慢速度。咱们可以用**哈希表(字典)**来优化,只需要遍历一次嵌套列表就能搞定,时间复杂度直接降到O(n),既高效又Pythonic。

核心思路

创建一个字典,键是嵌套列表里的数字,值是该数字第一次出现时的「子列表索引 + 元素在子列表中的索引」元组。遍历过程中,每遇到一个数字先查字典:

  • 如果数字已经在字典里,说明找到了跨子列表的重复元素,直接返回之前的位置和当前位置;
  • 如果不在,就把当前位置存进字典继续遍历。

代码实现(找第一个重复元素)

def find_duplicate_across_sublists(nested_list):
    num_positions = {}
    # 用enumerate同时获取子列表的索引和内容
    for sublist_idx, sublist in enumerate(nested_list):
        # 同样用enumerate获取元素在子列表里的索引
        for elem_idx, num in enumerate(sublist):
            if num in num_positions:
                # 取出之前存的位置,返回结果
                prev_sublist_idx, prev_elem_idx = num_positions[num]
                return {
                    "target_number": num,
                    "positions": [
                        ("子列表索引", prev_sublist_idx, "元素位置", prev_elem_idx),
                        ("子列表索引", sublist_idx, "元素位置", elem_idx)
                    ]
                }
            else:
                num_positions[num] = (sublist_idx, elem_idx)
    # 如果没有找到跨子列表的重复元素,返回None
    return None

# 测试你的示例
test_list = [[10, 9, 8], [8, 7], [1, 2, 3]]
print(find_duplicate_across_sublists(test_list))

运行后会输出:

{
    "target_number": 8,
    "positions": [
        ("子列表索引", 0, "元素位置", 2),
        ("子列表索引", 1, "元素位置", 0)
    ]
}

扩展:找所有跨子列表的重复元素

如果你需要找出所有符合条件的重复元素,而不仅仅是第一个,只需要稍微修改代码,把结果收集到列表里:

def find_all_duplicates_across_sublists(nested_list):
    num_positions = {}
    duplicates = []
    for sublist_idx, sublist in enumerate(nested_list):
        for elem_idx, num in enumerate(sublist):
            if num in num_positions:
                duplicates.append({
                    "target_number": num,
                    "positions": [num_positions[num], (sublist_idx, elem_idx)]
                })
            else:
                num_positions[num] = (sublist_idx, elem_idx)
    return duplicates

为什么这个方法更高效?

字典的查找操作是O(1)的常数时间,整个过程只需要遍历一次所有元素,时间复杂度是O(N)(N是嵌套列表中所有元素的总数),相比多层循环的O(N²),数据量越大,效率提升越明显。而且用enumerate同时获取索引和元素,写法也非常符合Python的风格。

内容的提问来源于stack exchange,提问作者NicolaiF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:04:49