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