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()
函数删除了正则表达式的用法