比较列表的元素

Posted

技术标签:

【中文标题】比较列表的元素【英文标题】: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 是的,谢谢,已编辑 【参考方案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)

【讨论】:

以上是关于比较列表的元素的主要内容,如果未能解决你的问题,请参考以下文章

将每个元素与列表中的其他元素进行比较

比较列表的元素

Python:利用for循环比较两个列表元素的异同进而找出共有元素各自不同元素并全部导出到csv文件实现代码

列表补充,列表的组合查询元素是否存在列表,查询元素出现在列表中几次

比较 JSP 中两个列表的元素并根据比较隐藏字段

比较 NSMutableArray 元素以从列表中查找第二大元素