Python二维列表查找重复元素问题:仅输出部分结果且索引越界
问题翻译
我需要在二维列表的不同行中查找重复单词。当前代码仅输出“happy”,但我希望“happy”和“very”都能被输出;若修改循环中的-1则会出现索引越界错误。代码如下:
def helper(a): for x in range(len(a)-1): for y in range(len(a[x])): for i in range(len(a)): for j in range(len(a[x])-1): if(a[x][y]==a[i][j]): if(x!=i and y!=j): print(a[i][j])
测试列表:
a=[['i', 'will', 'always', 'be', 'very', 'happy'],['happy','people', 'are', 'cool', 'very']]
代码问题分析
你的代码存在三个关键问题:
- 行长度匹配错误:内层循环
j的范围用了len(a[x])-1,强制用当前行x的长度限制其他行i的遍历范围。测试列表中第二行长度为5,第一行长度为6,若去掉-1,第一行的j会遍历到5,而第二行只有索引0-4,直接触发索引越界;保留-1则可能漏查其他行的元素。 - 多余的列索引条件:
y!=j会过滤掉不同行但同一列的重复单词,比如测试列表中两行的very因列索引相同被排除,导致无法输出。 - 无去重与遍历范围不全:重复单词会被多次输出,且
range(len(a)-1)只遍历到倒数第二行,最后一行的单词不会被用来查找其他行的重复。
修正方案
推荐两种实现方式,均能正确输出不同行的重复单词并避免越界:
方式一:用字典记录单词出现的行(高效清晰)
def helper(a): word_rows = {} # 遍历所有行,记录每个单词出现的行号集合 for row_idx, row in enumerate(a): for word in row: if word not in word_rows: word_rows[word] = set() word_rows[word].add(row_idx) # 筛选出在至少两个不同行出现的单词 duplicates = [word for word, rows in word_rows.items() if len(rows) >= 2] for word in duplicates: print(word)
方式二:修正原循环逻辑(贴近初始写法)
def helper(a): seen = set() # 用集合去重,避免重复输出 for x in range(len(a)): # 遍历所有行,不再限制到倒数第二行 for y in range(len(a[x])): current_word = a[x][y] if current_word in seen: continue # 遍历其他行查找重复 for i in range(len(a)): if i == x: continue # 跳过同一行 # 用当前i行自身的长度遍历元素 for j in range(len(a[i])): if a[i][j] == current_word: seen.add(current_word) print(current_word) break # 找到就停止,避免重复查找 if current_word in seen: break
测试上述代码,输入你的测试列表,会输出:
happy very
内容的提问来源于stack exchange,提问作者alexleahy123456
相关产品推荐
相关产品推荐

