【问题标题】:Indexing with loops in python在python中使用循环索引
【发布时间】:2018-02-11 05:09:38
【问题描述】:

问题要求编写一个函数,该函数接受一些无序列表并从该无序列表中提取任何有序的子列表。示例 [5, 2, 1, 3, 4] 将变为 [1,3,4]。我的问题在于索引,我想要一种方式来表达如果当前迭代大于它之前的迭代,我想添加它。但是,我的代码遇到的问题是它比较了一个项目的第一个和最后一个。

对于我的代码: [5, 2, 1, 3, 4] => [5,1,3,4]

def numIncreasing(lst):
    ans=[]
    for index in range(len(lst)):
        if lst[index]>=lst[index-1]:
            ans.append(lst[index])
        elif lst[index]<lst[index-1] and lst[index]<lst[index+1]:
            ans.append(lst[index])
        else:
            continue

    return ans

编辑:修复了无法识别模式开头的代码

【问题讨论】:

  • 您的缩进导致语法错误。
  • 也不清楚您期望的行为是什么。您说“任何已订购的子列表”。如果一个列表有多个有序子列表怎么办?例如,[5, 1, 2, 3, 4, 9, 6, 7, 8]?
  • 目前还不清楚在 no 长度大于 1 的排序子列表的情况下会发生什么。(我假设长度为 1 的排序子列表不是当然,这很有趣,但如果这个假设是错误的,请纠正我。)那么不包含任何元素的空列表呢?
  • 子列表必须大于一且 [5, 1, 2, 3, 4, 9, 6, 7, 8] => [1, 2, 3, 4, 9]
  • @barskyn 你想要最大的子列表吗?好像是这样。

标签: python loops indexing


【解决方案1】:

这是一个找到最大有序子列表的算法:

def increasing2(lst):
    length = len(lst)

    for size in range(length, 1, -1):
        for start in range(0, length - size + 1):
            curr = lst[start:start+size]
            if all(x <= y for x, y in zip(curr, curr[1:])):
                return curr

    return None

其行为如下:

>>> increasing2([5, 2, 1, 3, 4])
[1, 3, 4]

方法逻辑:

  • 以相反的顺序遍历所有子列表,因此最大的子列表排在较小的子列表之前:

    [5, 2, 1, 3, 4]
    [5, 2, 1, 3]
    [2, 1, 3, 4]
    [5, 2, 1]
    [2, 1, 3]
    [1, 3, 4]
    [5, 2]
    [2, 1]
    [1, 3]
    [3, 4]
    
  • 如果当前列表已排序,则返回它。否则继续按从最大到最小长度的顺序遍历所有子列表。这可确保您首先获得最大的子列表。该算法也只考虑长度为 2 或更大的子列表。

【讨论】:

  • 一些想法:我们可以覆盖旧候选人,如果剩余长度小于您可以返回的候选人。
  • @AntonvBR 但是您仍然需要检查所有可能的排序子列表,因为该算法会生成从最小到最大长度的子列表。最大的排序列表很可能在最后一次迭代中。如果我误解了你,我深表歉意。
  • @AntonvBR 我想出了一个更好的方法。而是向后循环,以便您在访问较小的子列表之前访问最大的子列表。然后在第一个排序的子列表上退出循环。
  • 是的,这看起来更好。一开始我以为你经历了很多虚假的候选人。
  • 问题不求最大。它要求“任何已订购的子列表”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2016-07-24
相关资源
最近更新 更多