Python 列表中第一个无序的元素
对于列表Python 列表中第一个无序的元素,python,Python,对于列表[1,4,6,8,2,10]它应该返回2 对于列表[1,6,7,9,3,10]它应该返回3 它应该返回第一个比最后一个小的数字,第一个顺序错误的数字 我该怎么做?这是我写的,有两个版本。我一整天都在工作,但没有成功 #1版本 def out_of_order(lst): for a in range(0,len(lst)): for b in range(a+1,len(lst)): if(b<a):
[1,4,6,8,2,10]
它应该返回2
对于列表[1,6,7,9,3,10]
它应该返回3
它应该返回第一个比最后一个小的数字,第一个顺序错误的数字
我该怎么做?这是我写的,有两个版本。我一整天都在工作,但没有成功
#1版本
def out_of_order(lst):
for a in range(0,len(lst)):
for b in range(a+1,len(lst)):
if(b<a):
print(b)
break
else:
print("none")
def无序(lst):
对于范围(0,len(lst))内的a:
对于范围(a+1,len(lst))内的b:
如果(b只需将最后一个选中的元素保留在列表中,并检查列表中的当前元素是否较小
def out_of_order(lst):
before = 0
for y in lst:
if y < before:
return y
before = y
print(out_of_order([1,4,6,8,2,10]))
print(out_of_order([1,6,7,9,3,10]))
def无序(lst):
之前=0
对于lst中的y:
如果y<之前:
返回y
之前=y
打印(按顺序打印([1,4,6,8,2,10]))
打印(按顺序打印([1,6,7,9,3,10]))
您的第二个版本已经正确-您只需要返回值,而不是打印它:
def out_of_orders(lst):
for a, b in zip(lst, lst[1:]):
if b < a:
return b
def出订单(lst):
对于zip中的a,b(lst,lst[1:]):
如果b
有关更快的解决方案,请参阅Christian Berendt的答案
第一个代码最重要的问题是它应该选中lst[a]
,而不是a
。解决方法:
def out_of_order(lst):
for a in range(0,len(lst)):
for b in range(a+1,len(lst)):
if(lst[b]<lst[a]):
print(lst[b])
return
print("none")
out_of_order([1,6,7,9,3,10])
def无序(lst):
对于范围(0,len(lst))内的a:
对于范围(a+1,len(lst))内的b:
if(lst[b]你得到的是什么输出?1或仅仅是连续的数字0到13几次次要的狡辩-如果列表的第一个元素是负数,这会中断。我会使用before=float('-inf'))
个人。当然。如果使用值<1,则必须在使用值之前调整。这不是内存效率。可以使用itertools.tee
避免创建列表副本(以及python2中的itertools.izip
)。
def out_of_order(lst):
for a in range(0,len(lst)):
for b in range(a+1,len(lst)):
if(lst[b]<lst[a]):
print(lst[b])
return
print("none")
out_of_order([1,6,7,9,3,10])