python:如何在没有空格的情况下提取字符串中不同长度的连续切片

python:如何在没有空格的情况下提取字符串中不同长度的连续切片,python,python-3.x,Python,Python 3.x,例如,在789101112的字符串中 i = 1 j = 0 x = '789101112' while i < 3: while j < len(x): m = int(x[j: j+i]) n = int(x[j+i: j+i+i]) if n - m ==1: print(m, n) j +=i 我想要的输出是: 7 8 8 9 9 10 10 11 11 12

例如,在
789101112
的字符串中

i = 1 
j = 0 
x = '789101112'  
while i < 3:
    while j < len(x):
        m = int(x[j: j+i])
        n = int(x[j+i: j+i+i])
        if n - m ==1:
            print(m, n)
            j +=i
我想要的输出是:

7 8
8 9
9 10
10 11
11 12

基于我的代码,我需要做些什么?

我对算法有一点粗略的想法,但我想写一个示例程序所花的时间比我预期的要多一些

注:我假设序列中缺少连续数字的最大计数为1。您可以修改代码并将最大计数应用为无限或任何其他您喜欢的数字

这里已经过了午夜,所以代码没有经过彻底测试。这是:

def get_first_num(string):
    first_num=0
    for i in range(int(len(string)/2)):
        if string.startswith(string[0:i+1]+str(int(string[0:i+1])+1)) or string.startswith(string[0:i+1]+str(int(string[0:i+1])+2)):    #max difference between any 2 consecutive numbers must be 1 or 2 i.e only 1 missing number in sequence is allowed
            assumed_first_num, temp, count, flag=int(string[0:i+1]), string, 0, False

            temp=temp.replace(str(assumed_first_num), '', 1)
            count += 1

            for _ in range(100):
                changed = False
                if(temp.startswith(str(assumed_first_num+1)) or temp.startswith(str(assumed_first_num+2))):
                    next_assumed_first_num=assumed_first_num+1 if temp.startswith(str(assumed_first_num+1)) else assumed_first_num+2
                    temp=temp.replace((str(assumed_first_num+1) if temp.startswith(str(assumed_first_num+1)) else str(assumed_first_num+2)), '', 1)
                    assumed_first_num, changed, count=next_assumed_first_num, True, count+1
                if len(temp) == 0:
                    flag=True
                    break
                if not changed:
                    flag=False
                    break
            if(flag):
                first_num=int(string[0:i+1])
                break
            else:
                continue
    return first_num

test_strings=["789101112", "910111213", "91112131415", "1214161820", "891089118912", "890892893894", "123451234712348", "1234567123456812345691234570"]
for string in test_strings:
    print("First number "+str(get_first_num(string))+" determined from string: "+string)
上述程序的输出为:

$ python3 script.py 
First number 7 determined from string: 789101112
First number 9 determined from string: 910111213
First number 9 determined from string: 91112131415
First number 12 determined from string: 1214161820
First number 8910 determined from string: 891089118912
First number 890 determined from string: 890892893894
First number 12345 determined from string: 123451234712348
First number 1234567 determined from string: 1234567123456812345691234570
问题的主要挑战和棘手部分是确定系列中的第一个数字;到现在为止,我只编写了确定第一个数的函数。我现在就要睡觉了,但我会扩展程序来确定序列中缺失的数字,与此相比,这不会花费太多时间


另外,for循环最里面的100和该循环的
count
实际上计算了给定序列的一致性,最多100个元素作为样本,保证一致性。

我对算法有一点粗略的了解,但我想它花费的时间比我预期的要多一些编写一个示例程序

注:我假设序列中缺少连续数字的最大计数为1。您可以修改代码并将最大计数应用为无限或任何其他您喜欢的数字

这里已经过了午夜,所以代码没有经过彻底测试。这是:

def get_first_num(string):
    first_num=0
    for i in range(int(len(string)/2)):
        if string.startswith(string[0:i+1]+str(int(string[0:i+1])+1)) or string.startswith(string[0:i+1]+str(int(string[0:i+1])+2)):    #max difference between any 2 consecutive numbers must be 1 or 2 i.e only 1 missing number in sequence is allowed
            assumed_first_num, temp, count, flag=int(string[0:i+1]), string, 0, False

            temp=temp.replace(str(assumed_first_num), '', 1)
            count += 1

            for _ in range(100):
                changed = False
                if(temp.startswith(str(assumed_first_num+1)) or temp.startswith(str(assumed_first_num+2))):
                    next_assumed_first_num=assumed_first_num+1 if temp.startswith(str(assumed_first_num+1)) else assumed_first_num+2
                    temp=temp.replace((str(assumed_first_num+1) if temp.startswith(str(assumed_first_num+1)) else str(assumed_first_num+2)), '', 1)
                    assumed_first_num, changed, count=next_assumed_first_num, True, count+1
                if len(temp) == 0:
                    flag=True
                    break
                if not changed:
                    flag=False
                    break
            if(flag):
                first_num=int(string[0:i+1])
                break
            else:
                continue
    return first_num

test_strings=["789101112", "910111213", "91112131415", "1214161820", "891089118912", "890892893894", "123451234712348", "1234567123456812345691234570"]
for string in test_strings:
    print("First number "+str(get_first_num(string))+" determined from string: "+string)
上述程序的输出为:

$ python3 script.py 
First number 7 determined from string: 789101112
First number 9 determined from string: 910111213
First number 9 determined from string: 91112131415
First number 12 determined from string: 1214161820
First number 8910 determined from string: 891089118912
First number 890 determined from string: 890892893894
First number 12345 determined from string: 123451234712348
First number 1234567 determined from string: 1234567123456812345691234570
问题的主要挑战和棘手部分是确定系列中的第一个数字;到现在为止,我只编写了确定第一个数的函数。我现在就要睡觉了,但我会扩展程序来确定序列中缺失的数字,与此相比,这不会花费太多时间


此外,最内层for循环中的100和该循环的
计数
从字面上计算给定序列的一致性,最多100个元素作为保证一致的样本。

我认为代码的问题是最后一行
j+=I
i
从未递增!所以它总是1。另外,在序列中,比如说从9到10,它突然变成了2个数字,然后你还需要设置下一个数字,看看它是否仍然正常

由于序列保证递增1,因此此替代代码可能是一个惰性解决方案:

def start_seq(num_str):
    '''determines the number the sequence starts with (minimum 3 numbers
    inside sequence)'''
    for i in range(1,len(num_str)//3):
        num1 = int(num_str[0:i])
        num2 = num1 + 1
        num3 = num2 + 1
        seq = str(num1)+str(num2)+str(num3)
        if num_str.startswith(seq):
            return num1
        else:
            continue
    return -1

def output_sequence(num_str):
    num1 = start_seq(num_str)
    if num1 == -1:            
        print('not a valid sequence')
        raise ValueError

    processed_seq = str(num1)

    counter = 0 # for printing '\n'
    #continue until reaching the end of sequence.
    while processed_seq !=num_str:
        print(num1,end=' ')
        if counter%2 == 1:
            print('\n',end='')
        num1 += 1
        processed_seq += str(num1)
        counter += 1

if __name__ == '__main__':
    output_sequence('789101112')

我认为您的代码的问题在于最后一行
j+=I
I
从未递增过!所以它总是1。另外,在序列中,比如说从9到10,它突然变成了2个数字,然后你还需要设置下一个数字,看看它是否仍然正常

由于序列保证递增1,因此此替代代码可能是一个惰性解决方案:

def start_seq(num_str):
    '''determines the number the sequence starts with (minimum 3 numbers
    inside sequence)'''
    for i in range(1,len(num_str)//3):
        num1 = int(num_str[0:i])
        num2 = num1 + 1
        num3 = num2 + 1
        seq = str(num1)+str(num2)+str(num3)
        if num_str.startswith(seq):
            return num1
        else:
            continue
    return -1

def output_sequence(num_str):
    num1 = start_seq(num_str)
    if num1 == -1:            
        print('not a valid sequence')
        raise ValueError

    processed_seq = str(num1)

    counter = 0 # for printing '\n'
    #continue until reaching the end of sequence.
    while processed_seq !=num_str:
        print(num1,end=' ')
        if counter%2 == 1:
            print('\n',end='')
        num1 += 1
        processed_seq += str(num1)
        counter += 1

if __name__ == '__main__':
    output_sequence('789101112')

字符串是否保证具有递增的数字顺序?如果不是,我们将需要在数字之间使用某种分隔符是的,字符串必须按递增顺序排列。我只是不知道当情况变成9和10时该怎么办当输入是891089118912,输出是89108118912,对吗?数字的最大值和最小值(范围)是多少?在你的例子中,它是7到12,那么最大值和最小值是多少?@user5802211所以根据你的说法,你甚至可以有一个像98 1025 1026.的序列,对吗?你想检测丢失的99到1024号吗?我认为如果你至少能告诉我们丢失的连续数字的最大数量,这是可行的。字符串保证有递增的数字顺序吗?如果不是,我们将需要在数字之间使用某种分隔符是的,字符串必须按递增顺序排列。我只是不知道当情况变成9和10时该怎么办当输入是891089118912,输出是89108118912,对吗?数字的最大值和最小值(范围)是多少?在你的例子中,它是7到12,那么最大值和最小值是多少?@user5802211所以根据你的说法,你甚至可以有一个像98 1025 1026.的序列,对吗?你想检测丢失的99到1024号吗?我认为,如果您至少能告诉我们丢失连续数字的最大计数,这是可行的?您的代码受到第3行指定的
范围(1100)
语句的限制。对于较大的数字,比如12345671234568,即使将范围增加到
(1100000)
Hi-ritesht93,它也会不必要地计算到1234567,这有点草率。我对它进行了修改,希望它更健壮。我这样做的原因是为了避免正则表达式,这样它就有希望获得一点速度。因为我们只是从左到右递增地匹配字符串序列,所以不需要正则表达式。我还使用了一个简单的
replace()
函数删除了正则表达式的用法。您的代码受第3行指定的
范围(1100)
语句的限制。对于较大的数字,比如12345671234568,即使将范围增加到
(1100000)
Hi-ritesht93,它也会不必要地计算到1234567,这有点草率。我对它进行了修改,希望它更健壮。我这样做的原因是为了避免正则表达式,这样它就有希望获得一点速度。因为我们只是从左到右递增地匹配字符串序列,所以不需要正则表达式。我还使用了一个简单的
replace()
函数删除了正则表达式的用法