Python在列表

问题描述

我有一个正整数列表(索引),并且想要找到循环(这里:复制列表元素的相邻序列)作为迭代算法的一部分。迭代次数小于10^6。在每次迭代中,一个数字被附加到列表中(最初列表是空的)并且应该检查列表的循环。列表大小通常应小于 10^6,通常在 0 - 10^5 范围内,并且整数可能小于 10^6。

具有循环的列表示例(这里,更一般地说,列表可能会超出循环,并且可能包含多个甚至嵌套的循环):

  • [0,5,6,1,3,8,7,0] --> [5,3]
  • [0,2,4,7] --> [3],[3]
  • [2,5] --> [1],[3],[1],[1,3]
  • [7,9,4] --> [1,9]

没有循环的列表示例:

  • [0,0]
  • [0,7]
  • [2,5]
  • [7,4]

最快(也可以选择最优雅/pythonic)的方式**

  • 查找是否存在循环,返回 True 或 False,以及
  • 可选:返回所有循环,有或没有任何类型的循环排序(例如,按列表中第一个循环元素的索引,然后按循环长度)?

解决方法

这是我能给的最好的。

from math import floor
sample = samples[0]
def find_max_seq(sample):
    max_possible_size_ans = floor(len(sample)/2)
    possible_size_ans = list(range(1,max_possible_size_ans+1))
    max_idx = len(sample)-1
    outs = []
    for size in possible_size_ans:
        last_idx= 0
        start_idx = 0
        while last_idx < max_idx :
            first_pair = sample[start_idx:start_idx+size]
            second_start = start_idx+size
            second_pair = sample[second_start:second_start+size]
            if first_pair == second_pair:
                outs.append(first_pair)
            start_idx +=1
            last_idx = second_start+size
            
    return outs