Python中如何找到列表中连续数的第一个索引?

比如有一个列表[1,2,3,3,3,9,9,9], 因为 3 和 9 都连续出现了 3 次,那输出应该是其中比较大的,也就是 9 的连续数的第一个 index,即 5. 而如果列表是[1,9,9,3,2,9,9,9],因为 9 最后出现了三次,那输出应该是 index 5.
我一开始的想法是 itertools 的 groupby, 但是应该怎么输出第一个 index 啊。。希望有人帮忙解答,谢谢!
Python中如何找到列表中连续数的第一个索引?

9 回复

到底要第一个 index 还是最后一个 index ?

去掉第一个元素,然后对应位置相减试试:
[1,2,3,3,3,9,9,9]
[2,3,3,3,9,9,9]


def find_first_consecutive_index(lst, sequence):
    """
    在列表中找到指定连续序列的第一个索引
    
    参数:
    lst: 目标列表
    sequence: 要查找的连续序列(列表形式)
    
    返回:
    如果找到则返回第一个索引,否则返回-1
    """
    if not sequence:  # 空序列直接返回0
        return 0
    
    n = len(lst)
    m = len(sequence)
    
    if m > n:  # 序列比列表长,不可能找到
        return -1
    
    for i in range(n - m + 1):
        # 检查从i开始的m个元素是否与sequence完全匹配
        if lst[i:i+m] == sequence:
            return i
    
    return -1

# 使用示例
if __name__ == "__main__":
    # 示例1:基本用法
    my_list = [1, 2, 3, 4, 5, 3, 4, 5, 6]
    target = [3, 4, 5]
    result = find_first_consecutive_index(my_list, target)
    print(f"列表: {my_list}")
    print(f"查找序列: {target}")
    print(f"第一个索引: {result}")  # 输出: 2
    
    # 示例2:多个匹配的情况
    my_list2 = [1, 2, 1, 2, 3, 1, 2, 3]
    target2 = [1, 2, 3]
    result2 = find_first_consecutive_index(my_list2, target2)
    print(f"\n列表: {my_list2}")
    print(f"查找序列: {target2}")
    print(f"第一个索引: {result2}")  # 输出: 2
    
    # 示例3:找不到的情况
    my_list3 = [1, 2, 3, 4, 5]
    target3 = [6, 7]
    result3 = find_first_consecutive_index(my_list3, target3)
    print(f"\n列表: {my_list3}")
    print(f"查找序列: {target3}")
    print(f"第一个索引: {result3}")  # 输出: -1

这个函数通过滑动窗口的方式遍历列表,时间复杂度是O(n*m),其中n是列表长度,m是序列长度。对于大多数实际应用场景来说效率足够。

简单说就是遍历列表找连续匹配的片段。

笨方法就是建两个列表 obs_num 和 obs_count,前者是观测到的数字,后者是这个数字连续出现的次数,然后输出 obs_count 最大时 obs_num 的最大值。

完全没看懂你的问题是什么,我猜要求是

1. 连续次数最多的数在连续最多次那一段的第一个数的下标
2. 在 1 的基础上,如果有多个数字出现了相同的最多连续次数,选最大的那个数符合 1 的输出
3. 在 2 的基础上,如果有多个相同数字出现了最多连续次数且都是最大,选第一次连续段符合 1 的输出

如果是我的这个猜测,那么

python<br># coding: utf8 <br> <br>list1 = [1, 2, 3, 3, 3, 9, 9, 9] <br>list2 = [1, 9, 9, 3, 2, 9, 9, 9] <br> <br> <br>def first_index(input_list): <br> fi = [0, 0, -1] # 已知符合条件的数字,最大连续次数,首次下标 <br> curr = [None, 0, -1] <br> <br> for idx, num in enumerate(input_list): <br> if num != curr[0]: <br> curr = [num, 1, idx] <br> else: <br> curr[1] += 1 <br> <br> if curr[1] &gt; fi[1]: <br> fi[0] = curr[0] <br> fi[1] = curr[1] <br> fi[2] = curr[2] <br> elif curr[1] == fi[1]: <br> if curr[0] &gt; fi[0]: <br> fi[0] = curr[0] <br> fi[1] = curr[1] <br> fi[2] = curr[2] <br> <br> return fi[2] <br> <br> <br>print first_index(list1) <br>print first_index(list2) <br><br>

是要一组连续数的第一个数的 index
能讲讲什么叫对应位置相减吗

嗯就是这个要求 真是惭愧,语文表达都成问题
这个办法很好,我一开始用 dictionary 记录 index 和次数,但没用 enumerate 而使用 while i < len(ls) 然后再遇到重复 i += 1 这样的,结果遇到了超了 list 的 index 哎

这应该是道算法题(不知道是不是 leetcode 上面的…)

l = [1,2,3,3,3,9,9,9]
l = [1,9,9,9,3,2,9,9,9]
counts = [[1,0,l[0]]]
i = 0
for idx, item in enumerate(zip(l[:-1], l[1:])):
prev, nxt = item
if prev == nxt:
counts[i][0] += 1
else:
counts.append([1,nxt,idx+1])
i += 1

print(counts, l)
print(sorted(counts, key=lambda x:(x[0],x[1],-x[2]), reverse=True)[0])
# 按出现次数、元素本身大小和元素序号(逆序)排序
print(sorted(counts, key=lambda x:(x[0],x[1],-x[2]), reverse=True)[0])
# 按出现次数、元素本身大小和元素序号排序

输出:

[[1, 0, 1], [3, 9, 1], [1, 3, 4], [1, 2, 5], [3, 9, 6]] [1, 9, 9, 9, 3, 2, 9, 9, 9]
[3, 9, 1]
[3, 9, 6

回到顶部