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中如何找到列表中连续数的第一个索引?
到底要第一个 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] > 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] > 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

