检测数字序列中的重复循环(python)

检测数字序列中的重复循环(python),python,numbers,sequence,cycle,Python,Numbers,Sequence,Cycle,我想知道这样做的一个相当“普通”或正常的方式是什么。我并不是真的在寻找最短的答案,比如说一条2字线或者其他什么。我刚刚快速地将这段代码组合在一起,但我不觉得其中有太多内容。 此外,如果有任何图书馆可以帮助这一点,那将是非常好的 def get_cycle(line): nums = line.strip().split(' ') # 2 main loops, for x and y for x in range(2, len(nums)): # (starts at

我想知道这样做的一个相当“普通”或正常的方式是什么。我并不是真的在寻找最短的答案,比如说一条2字线或者其他什么。我刚刚快速地将这段代码组合在一起,但我不觉得其中有太多内容。 此外,如果有任何图书馆可以帮助这一点,那将是非常好的

def get_cycle(line):
    nums = line.strip().split(' ')

    # 2 main loops, for x and y
    for x in range(2, len(nums)): # (starts at 2, assuming the sequence requires at least 2 members)
        for y in range(0, x):
            # if x is already in numbers before it
            if nums[x] == nums[y]:
                seq = [nums[x]] # (re)start the sequence
                adder = 1       # (re)set the adder to 1
                ok = True       # (re)set ok to be True
                # while the sequence still matches (is ok) and
                # tail of y hasn't reached start of x
                while ok and y + adder < x:
                    if nums[x + adder] == nums[y + adder]:  # if next y and x match
                        seq.append(nums[x + adder])         # add the number to sequence
                        adder += 1                          # increase adder
                    else:
                        ok = False                          # else the sequence is broken
                # if the sequence wasn't broken and has at least 2 members
                if ok and len(seq) > 1:
                    print(' '.join(seq))    # print it out, separated by an empty space
                    return
def get_循环(行):
nums=line.strip().split(“”)
#2个主回路,用于x和y
对于范围(2,len(nums))中的x:#(从2开始,假设序列至少需要2个成员)
对于范围(0,x)内的y:
#如果x在它前面的数字中已经存在
如果nums[x]==nums[y]:
seq=[nums[x]#(重新)启动序列
加法器=1#(重新)将加法器设置为1
ok=True 35;(重新)将ok设置为True
#当序列仍然匹配(正常)且
#y的尾部尚未到达x的起点
当ok和y+加法器1:
打印(''.join(seq))#打印出来,用空格隔开
返回
您的问题实际上是“x:x+k中的所有项目是否与y:y+k中的项目匹配”。也就是说,一个k长度子集是否在一行中出现两次


你希望x:x+k与y:y+k不重叠。实现这一点的简单方法是将y定义为x加上一些偏移量d。如果您确信k我可能没有正确理解这一点,但我认为使用正则表达式有一个非常简单的解决方案

(.+ .+)( \1)+
以下是一个例子:

>>> regex = re.compile(r'(.+ .+)( \1)+')
>>> match = regex.search('3 0 5 5 1 5 1 6 8')
>>> match.group(0)    # entire match
'5 1 5 1'
>>> match.group(1)    # repeating portion
'5 1'
>>> match.start()     # start index of repeating portion
6

>>> match = regex.search('2 0 6 3 1 6 3 1 6 3 1')
>>> match.group(1)
'6 3 1'
下面是它的工作原理,
(.+)
将匹配至少两个数字(尽可能多),并将结果放入捕获组1
(\1)+
将至少匹配一次捕获组1内容后面的空格

以及字符串
'3 0 5 1 5 1 6 8'
的扩展解释:

  • (.+.+)
    最初将匹配整个字符串,但将放弃结束字符,因为
    (\1)+
    将失败,此回溯将发生,直到
    (.+)
    无法匹配字符串开头,此时正则表达式引擎将在字符串中向前移动并重试
  • 这将发生在捕获组从第二个5开始之前,它将在最后放弃字符,直到捕获
    '5 1'
    ,此时正则表达式正在为
    (\1)+
    查找任意数量的
    '5 1'
    ,它当然会找到这一点,匹配将成功

请试着用语言描述所有这一切的作用。这是一个相当密集的问题。如果这是一个正常的工作,它可能是一个更好的密度抱歉的问题。它读取一个数字序列,例如“3 0 5 5 1 5 1 6 8”,必须找到重复的第一个数字序列,在本例中为“5 1 5 1”,并打印出单个序列(“5 1”)。编辑:也是的,这很有效,但我想一定有更好的方法——输入文本文件:20631631----输出631----为什么它不打印('5')?它应该打印最长的序列吗?只有长度大于2的序列?是的-#如果序列没有被破坏并且至少有2个成员----如果ok和len(seq)>1:----必须至少有2个成员。。。我想1数字并不是将一个松散的问题转化为一个可操作的问题规范的序列+1。我真的不能仅仅从你写的那一行看出,但是序列必须在“自身”之后重复,而不是在这一行的任何地方重复两次。不过我会试试看,谢谢。如果x和y之间的偏移量,d等于k,那么你在寻找一个相邻的k长度序列。它不一定是最长的序列。它只是一个重复的循环,意味着类似于1365136的东西,没有一个循环,因为中间有一个5。需要找到第一个发生的,而不是最长的。我真的很期待看到解释。我已经做python大约一个星期了,我对整个正则表达式都很陌生。我想我应该多看看了。谢谢。现在我只需要认真研究一下,看看它的每一部分都做了什么,为什么。从未使用过compile()所以。。非常感谢
(.+。+)
我认为这将始终找到正好两组1个或多个字符,组之间用一个空格字符分隔。然后
(\1)+
部分将匹配它后面的任意数量的两件式组,这就是为什么我仍然不知道它如何匹配
631631