你怎么知道你的列表是否在python中升序

时间:2013-11-11 21:17:25

标签: python

我在python中编写了这个程序,看看列表是否在升序而且不起作用,有人可以帮助我吗?

list1 = [1, 2, 3, 4]
print (list1)
length = len(list1)
run_started = False
for x in range(length - 1):
    t = list1[x + 1] - list1[x]
    if t > 0 :
        if run_started:
            run_length = x
        else:
            run_started = True
            run_length = x
    else:
        if run_started:
            print (True)
            print ("Run Length: {0}".format(run_length))
            break
if not run_started:
    print (False)

5 个答案:

答案 0 :(得分:11)

我认为最简单(虽然不是最有效)的方式是:

list1 = [3, 1, 2, 4]

if sorted(list1) == list1:
    print "list1 is sorted"

答案 1 :(得分:3)

一个单行代码如何判断列表x中的每个数字是否严格增加?

[(x[k+1]-x[k])>0 for k in range(len(x)-1)].count(True) == len(x)-1

答案 2 :(得分:3)

嗯,这是我的理由。有人建议对列表进行排序,即O(nlogn)。我提出了一个更简单的O(n)解决方案

def isAscending(list):
    previous = list[0]
    for number in list:
        if number < previous:
            return False
        previous = number
    return True

答案 3 :(得分:1)

我认为OP正在问自己的代码有什么问题。如果是这种情况,请点击:

看起来你永远无法达到你想要的最终状态。我的意思是,你得到run_started变量以获得True。但那又怎样?您的代码中没有其他任何内容发生,因为您从未触发与else语句相反的if t > 0语句。我认为你应该重新考虑代码中的逻辑以及你希望它做什么

编辑:您的代码已被评论,我已将数字放入{{}}以显示按什么顺序发生的事情

list1 = [1, 2, 3, 4]
print (list1)
length = len(list1)
run_started = False
for x in range(length - 1): # Loop begins if not run_started
    t = list1[x + 1] - list1[x]
    if t > 0 : 
        if run_started:
            run_length = x #You keep setting a new run_length {{3}}
        else:
            run_started = True #You've set run_started  {{2}}
            run_length = x
    else:
        if run_started:
            print (True)
            print ("Run Length: {0}".format(run_length))
            break
if not run_started: #Then this is called after the loop {{4}} but it doesn't return true
    print (False)

正如您所看到的,您退出for循环而没有在第13行调用else。此外,最后{{1}}也永远不会被调用。您的代码按其设计的方式工作,但可能不是您希望它的工作方式。 HTH

答案 4 :(得分:0)

比完全构造排序列表更有效的方法(并且应该适用于任意可迭代类型,包含允许进行大于比较的任何数据类型):

def len_ascending_run_from_start(seq):
    vals = enumerate(seq)
    try:
        c,x = 1, vals.next()[1]
    except StopIteration:
        raise ValueError("Sequence is empty!")
    for i, cur_x in vals:
        if cur_x < x:
            break
        c,x = c+1, cur_x
    return c

E.g:

In [44]: len_ascending_run_from_start([datetime.date(2012,1,4), datetime.date(2012,1,3), datetime.date(2012,1,5)])
Out[44]: 1

In [45]: len_ascending_run_from_start([datetime.date(2012,1,4), datetime.date(2012,1,6), datetime.date(2012,1,5)])
Out[45]: 2

In [46]: len_ascending_run_from_start([datetime.date(2012,1,4), datetime.date(2012,1,6), datetime.date(2012,1,7)])
Out[46]: 3

In [47]: len_ascending_run_from_start((1,2,3,4))
Out[47]: 4

In [48]: len_ascending_run_from_start((1,3,2,4))
Out[48]: 2

In [49]: len_ascending_run_from_start(set([1,3,2,4]))
Out[49]: 4

使类len自动报告有关基础序列的统计信息(并保持结果的简单缓存,以避免重复计算)也可能是有趣/有用的。

class AscendingRunFromStart(object):
    def __init__(self, seq):
        self.seq = seq

    def __repr__(self):
        return self.seq.__repr__()
    __str__ = __repr__

    def __len__(self):
        if hasattr(self, "_len"):
            return self._len
        vals = enumerate(self.seq)
        c,x = 1, vals.next()[1]
        for i, cur_x in vals:
            if cur_x < x:
                break
            c,x = c+1, cur_x
        self._len = c
        return self._len

E.g:

In [76]: x = AscendingRunFromStart([1,3,2,4])

In [77]: x
Out[77]: [1, 3, 2, 4]

In [78]: len(x)
Out[78]: 2

一个好的扩展是使用描述符模式使类的seq属性成为只读,或者在调用len时调用更新的set计算。 (留给读者练习......)