比较列表元素

时间:2019-10-25 03:36:57

标签: python python-3.x list logic

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

4 个答案:

答案 0 :(得分:2)

时间复杂度为 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]

答案 1 :(得分:0)

这是我解决的方法:

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)

答案 2 :(得分:0)

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

但是您的尝试的time complexity为O(N ^ 2),因为您运行了一个length(li)的for循环和一个length(li)-1的嵌套循环,这意味着 for 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)时间

答案 3 :(得分:0)

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

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)