Python 比较列表中的元素

Python 比较列表中的元素,python,python-3.x,list,logic,Python,Python 3.x,List,Logic,给定,li=[6,1,5,1,3,1] 现在我想检查列表中的一个元素是否大于或等于所有后续元素。 所以我的回答应该是 6,5,3,1 请帮忙。 要求答案是“非pythonic”lol。 我试过这个 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作

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

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作为答案

我就是这样解决的:

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)
li=[6,1,5,1,3,1]
结果=[]
对于我在李:
指数=li.指数(i)
如果索引为0:
持续
如果索引为len(li)-1:
持续
如果li[index-1]li[index+1]:
结果.追加(i)
打印(结果)

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

但是,您的尝试有一个O(N^2),因为您运行了一个长度为(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)
输出(仍然相同):


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

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

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

[6, 5, 3, 1]

这将返回您预期的结果:

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)

你的答案不是:6531吗?因为6对后续元素来说也是最大的。您可以使用列表切片来获取超过给定索引的所有元素的列表,也可以使用
max()
来获取列表中的最大值。@Pratibhagutta是的,谢谢,editedThis似乎不适用于[6,1,5,1,3,1,1]答案应该是6,5,3,1,它只显示了5,3@suhaasbadada不用担心:)顺便说一句,我对你的尝试添加了一些评论,它可以帮助你提高编程技能!不适用于
li=[6,1,5,1,3,7,1]
,其中输出应该是
[7,1]
@suhaasbadada和blhsing,似乎我误解了这个问题,我添加了解释的解决方案,对此我真的很抱歉mistake@blhsing是否应包括
1
?由于它不再具有任何连续元素,尽管可以在我添加的解决方案中轻松更改,更新的解决方案在循环中调用
max
,导致时间复杂度为O(n^2)。
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)