目标是解析一个不良行为的程序的输出,该程序将数字列表(例如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;开始。作为初始元素并获得不同的解决方案(或者最终可能会留下不会形成列表下一个元素的剩余尾随数字字符)。
答案 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)