我正在进行编码挑战以获得乐趣并努力学习我的技能 - 你们中的一些人可能还记得去年12月的“代码问世”挑战,我正在努力解决这个问题。我已经将这段代码作为解决其中一个问题的解决方案,但是它运行缓慢。
inp = "1113122113"
def iterate(num):
pos = 0
new = ""
while pos < len(num):
counter = 0
d = num[pos]
for i in range(pos, len(num)):
if num[i] == d:
counter += 1
else:
break
new+=str(counter)
new+=str(d)
pos += counter
print len(new)
return new
for i in range (50):
inp = iterate(inp)
过去的迭代35左右,它达到了每次迭代花费几分钟的程度。目标是生成一个看起来顺序的序列 - 所以1到11,然后是21,1211,111221,3112211等等。我需要在第50次迭代后找到字符串的长度,但是在40次迭代之后它长达360154个字符并且我的代码没有足够优化来处理在合理时间内长的字符串。谁能给我一些指示?
答案 0 :(得分:1)
使用itertools.groupby
会非常快。
from itertools import groupby
def next_say(s):
return ''.join(str(sum(1 for _ in g))+k for k, g in groupby(s))
def iterate(num):
"""Generator that yields the first num iterations"""
val = '1'
for i in range(num):
val = next_say(val)
yield val
https://docs.python.org/2/library/itertools.html#itertools.groupby