我正在经历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/

10-12 17:00