【问题标题】:Comparing elements of a list比较列表的元素
【发布时间】:2020-02-21 09:54:03
【问题描述】:

给定,li=[6,1,5,1,3,1] 现在我想检查列表中的一个元素是否大于或等于所有后续元素。 所以我需要的答案应该是 6,5,3,1 请帮忙。 要求答案是“非pythonic”哈哈。 这个我试过了,

for i in range(len(li)):
    for j in li[i+1:]:
        if li[i]>j:
            print(li[i])
            break

它部分有效,但对于像 [6,1,5,1,3,1,1] 我也想要 1 作为答案的场景失败

【问题讨论】:

  • 你的答案不是:6 5 3 1?因为 6 对于后续元素也是最大的。
  • 您可以使用列表切片来获取所有超过给定索引的元素的列表,您可以使用max() 来获取列表中的最大值。
  • @PratibhaGupta 是的,谢谢,已编辑

标签: python python-3.x list logic


【解决方案1】:

时间复杂度为 O(n) 的更有效方法是以相反的顺序遍历列表,因此问题可以变得简单地确定当前项目是否大于或等于输出中的最后一项,最后再反转输出:

output = [li.pop()]
for i in reversed(li):
    if i >= output[-1]:
        output.append(i)
output = output[::-1]

output 变为:

[6, 5, 3, 1]

【讨论】:

    【解决方案2】:

    我就是这样解决的:

    li = [6, 1, 5, 1, 3, 1]
    
    result = []
    
    for i in li:
        index = li.index(i)
        if index is 0:
            continue
        if index is len(li) - 1:
            continue
        if li[index - 1] <= i => li[index + 1]:
            result.append(i)
     print(result)
    

    【讨论】:

    • 这似乎不适用于 [6,1,5,1,3,1,1] 答案应该是 6,5,3,1 它只显示 5,3
    【解决方案3】:

    欢迎来到堆栈溢出!我看到您已经编辑添加了一些证明您已经尝试过的代码,感谢您这样做,我们希望看到更多!

    但是您的尝试有一个 O(N^2) 的 time complexity,因为您运行一个长度为 (li) 的 for 循环和一个长度为 (li) - 1 的嵌套循环,这意味着 对于每个字符在 li 中,你必须经过len(li),这很慢。

    这是一种“非pythonic”的方式,它只循环li一次,而且相当简单:

    li=[6,1,5,1,3,1,1]
    prev = li[0] # first element
    output = []
    for i in range(1, len(li)):
        if(prev >= li[i]):
            output.append(prev)
        prev = li[i]
    
    print(output)
    

    输出:

    [6, 5, 3, 1]
    

    注意:在阅读了您的问题后,我意识到我可能误解了您的问题。

    现在我想检查列表中的一个元素是否大于或等于所有后续元素。

    我没有注意到“全部”,对此我深表歉意。

    我可以通过使用列表切片以“pythonic-ish”的方式做到这一点:

    li=[6,1,5,1,3,1,1]
    output=[]
    for i in range(0, len(li)):
        if(len(li[i+1:]) == 0): #if last element
            break # you can choose to count this in or not
        if(li[i] >= max(li[i+1:])): # if current element larger or equals max of ALL successive elements
            output.append(li[i])
    
    print(output)
    

    输出(还是一样):

    [6, 5, 3, 1]
    

    现在在这个解决方案中,时间复杂度将是 O(N^2),因为 max 是一个 O(N) 函数,并且它被调用 N 次,导致 O(N*N) = O(N ^2) 时间

    【讨论】:

    • @suhaasbadada 不用担心 :) 顺便说一下,我已经对您的尝试添加了一些评论,它可以帮助您提高编程技能!
    • 不适用于li = [6, 1, 5, 1, 3, 7, 1] 之类的情况,输出应为[7, 1]
    • @suhaasbadada 和 blhsing,我似乎误解了这个问题,我已经添加了解释的解决方案,我真的很抱歉这个错误
    • @blhsing 1 是否应该包含在内?因为它不再有任何连续的元素,尽管它可以在我添加的解决方案中轻松更改
    • 更新后的解决方案循环调用max,导致时间复杂度O(n ^ 2)
    【解决方案4】:

    这应该会返回您预期的结果:

    li=[6,1,5,1,3,1]
    filtered = []
    for i, val in enumerate(li):
     for r in li[i+1:]:
      if val > r:
       continue
      else:
       break
     else:
      filtered.append(val)
    print(filtered)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2015-09-30
      • 1970-01-01
      • 2015-08-01
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多