如何高效查找嵌套列表中跨子列表重复元素及其索引?
高效查找嵌套列表中跨子列表的重复元素位置
你之前用多层循环慢太正常了——这种方法相当于每个元素都要和其他所有元素挨个比对,时间复杂度是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
相关产品推荐
相关产品推荐

