Python:解析一串连接的升序整数

时间:2017-07-05 09:23:33

标签: python string-parsing

目标是解析一个不良行为的程序的输出,该程序将数字列表(例如3,4,5)连接成一个字符串" 345",没有任何非数字分隔数字。我也知道列表按升序排序。

我提出了以下解决方案,该解决方案从字符串重构列表:

a = '3456781015203040'
numlist = []

numlist.append(int(a[0]))

i = 1
while True:
    j = 1
    while True:
        if int(a[i:i+j]) <= numlist[-1]:
            j = j + 1
        else:
            numlist.append(int(a[i:i+j]))
            i = i + j
            break
    if i >= len(a):
        break

这很有效,但我觉得这个解决方案反映了我几十年前接受Pascal培训的事实。是否有更好或更多的pythonic方式来做它?

我知道问题是不合适的,即我可以从&#39; 34&#39;开始。作为初始元素并获得不同的解决方案(或者最终可能会留下不会形成列表下一个元素的剩余尾随数字字符)。

2 个答案:

答案 0 :(得分:1)

这可以找到所有可能的初始数字长度的解决方案:

a = '3456781015203040'

def numbers(a,n):
    current_num, i = 0, 0
    while True:
        while i+n <= len(a) and int(a[i:i+n]) <= current_num:
            n += 1
        if i+n <= len(a):
            current_num = int(a[i:i+n])
            yield current_num
            i += n
        else:
            return

for n in range(1,len(a)):
    l = list(numbers(a,n))
    # print only solutions that use up all digits of a
    if ''.join(map(str,l)) == a:
         print(l)
[3, 4, 5, 6, 7, 8, 10, 15, 20, 30, 40]
[34, 56, 78, 101, 520, 3040]
[34567, 81015, 203040]

答案 1 :(得分:0)

很少修改,允许解析&#34; 7000000000001&#34;数据并给出最佳输出(最大列表大小)

a = 30000001
def numbers(a,n):
    current_num, i = 0, 0
    while True:
        while i+n <= len(a) and int(a[i:i+n]) <= current_num:n += 1
        if i+2*n>len(a):current_num = int(a[i:]);yield current_num; return
        elif i+n <= len(a):current_num = int(a[i:i+n]);yield current_num;i += n
        else: return
        print(current_num)
for n in range(1,len(a)):
    l = list(numbers(a,n))
    if "".join(map(str,l)) == a:print (l)