如何用.index方法查找列表重复元素位置?附Spy Game函数问题
问题解答
一、查找列表中重复元素的位置
list.index()方法默认只会返回第一个匹配元素的索引,但可以通过指定start参数来查找后续的重复元素。比如你给出的例子mylist=[1,2,7,8,7,12],要获取第二个7的索引,写法如下:
mylist = [1,2,7,8,7,12] first_7_idx = mylist.index(7) second_7_idx = mylist.index(7, first_7_idx + 1) # 从第一个7的下一个位置开始查找 print(second_7_idx) # 输出4
如果要一次性获取所有匹配元素的索引,更通用的方式是用enumerate()遍历列表:
all_7_indices = [i for i, val in enumerate(mylist) if val == 7] print(all_7_indices) # 输出[2,4]
直接取列表的第二个元素all_7_indices[1]就能得到第二个7的索引。
二、优化Spy Game函数
你原有的函数逻辑存在缺陷:只对比了第一个0和第一个7的位置,完全没考虑第二个0的位置是否在第一个0之后、7之前。正确的思路是按顺序追踪目标序列[0,0,7]:遍历输入列表,每遇到目标序列里当前需要的元素,就把目标指针往后移一位,当指针走完整个目标序列时,就说明找到了符合要求的007顺序。
优化后的代码:
def spy_game(nums): target = [0, 0, 7] track_idx = 0 # 追踪目标序列的当前位置 for num in nums: if num == target[track_idx]: track_idx += 1 if track_idx == len(target): # 匹配完整个007序列 return True return False
测试示例:
spy_game([1,2,4,0,0,7,5])→ 匹配到0、0、7,返回Truespy_game([1,0,2,4,0,5,7])→ 匹配到0、0、7,返回Truespy_game([1,7,2,0,4,5,0])→ 仅匹配到单个0,未完成序列,返回False
这个逻辑能正确处理所有边界情况,比如[0,7,0,7]会返回False(第二个0在7之后,无法形成007顺序),[0,0,0,7]会返回True(只要有两个0在7之前即可)。
内容的提问来源于stack exchange,提问作者TheArvin98
相关产品推荐
相关产品推荐

