python - 如何根据元素在它们来自的列表中是否彼此相邻来拆分列表?

标签 python python-3.x list loops

我正在学习 MIT 主要 Python 类(class)的问题 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/

相关文章:

python - 对脚本排队器的建议

python - 使用 pandas groupby 或其他函数对多个数据帧进行子集化的简单方法?

python - Gensim `most_similar` 中的弃用警告?

python - 验证失败后从空表单数据中检索空字符串

r - 给定列表的一个元素,如何恢复其在列表中的索引?

python - 夹层中的页面区域

python - 绘制多面体的 3D 曲面

python - 尝试使用棉花糖使用 data_key 加载数据时出现“丢失数据”

Python 生成器函数和排列

java - 使用 ArrayList<ArrayList<String>>() 时 java 中出现意外输出