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])