我正在经历MIT首席python课程的问题3,并且我有一个公认的很长的脚本,感觉好像已经接近了。我需要打印s的最长子串,其中字母按字母顺序出现。对于旁边的字符,我可以按字母顺序拉出所有字符。我需要看的是:
输入:'aezcbobobegghakl'
所需的输出:'beggh'
我的输出:['a', 'e', 'b', 'b', 'b', 'e', 'g', 'g', 'a', 'k']
我的代码:
s = 'aezcbobobegghakl'
a = 'abcdefghijklmnopqrstuvwxyz'
len_a = len(a)
len_s = len(s)
number_list = []
letter_list = []
for i in range(len(s)):
n = 0
letter = s[i+n]
if letter in a:
number_list.append(a.index(letter))
n += 1
print(number_list)
for i in number_list:
letter_list.append(a[i])
print(letter_list)
index_list = []
for i in range(len(letter_list)):
index_list.append(i)
print(index_list)
first_check = []
for i in range(len(letter_list)-1):
while number_list[i] <= number_list[i+1]:
print(letter_list[i])
first_check.append(letter_list[i])
break
print(first_check)
在查看完问题后,我知道解决该问题的方法要短得多且完全不同,但是出于我的理解,是否有可能完成此代码以获取所需的输出?还是这只是我挖的兔子洞的迷失原因?
最佳答案
我将构建一个生成器来输出所有字符运行,例如l[i] >= l[i-1]
。然后找出其中最长的一次。就像是
def runs(l):
it = iter(l)
try:
run = [next(it)]
except StopIteration:
return
for i in it:
if i >= run[-1]:
run.append(i)
else:
yield run
run = [i]
yield run
def longest_increasing(l):
return ''.join(max(runs(l), key=len))
编辑:关于代码的注释
for i in range(len(s)):
n = 0
letter = s[i+n]
if letter in a:
number_list.append(a.index(letter))
n += 1
正在获取每个字母的“数字值”。您可以使用
ord
函数来简化此操作number_list = [ord(c) - 97 for c in s if c.islower()]
您永远不会使用
index_list
,也永远不会。查看enumerate
函数。first_check = []
for i in range(len(letter_list)-1):
while number_list[i] <= number_list[i+1]:
print(letter_list[i])
first_check.append(letter_list[i])
break
这部分没有多大意义。每次
break
都从while
循环中退出,因此基本上是if
。您无法跟踪多个运行。您这里没有机制来比较字符的运行。我想您可能正在尝试做类似的事情max_run = []
for i in range(len(letter_list)-1):
run = []
for j in range(i, len(letter_list)):
run.append(letter_list[j])
if letter_list[j] > letter_list[j+1]:
break
if len(run) > len(max_run):
max_run = run
(免责声明:我很确定上面的内容是一个问题,但这应该是说明性的)。可以通过很多方式改进上述内容。请注意,它在最后一个字符上循环最多
len(s)
次,使其成为n**2
解决方案。另外,我不确定为什么需要number_list
,因为可以直接比较字符串。关于python - 如何根据元素来自它们的列表中相邻的元素来拆分列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47948423/