7

我在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)
4

5 回答 5

20

我想说最简单(尽管不是最有效)的方法是:

list1 = [3, 1, 2, 4]

if sorted(list1) == list1:
    print "list1 is sorted"
于 2013-11-11T21:24:29.893 回答
9

好吧,这就是我的尝试。有些人建议对列表进行排序,这将是 O(nlogn)。我提出了一个更简单的 O(n) 解决方案

def isAscending(list):
    previous = list[0]
    for number in list:
        if number < previous:
            return False
        previous = number
    return True
于 2013-11-11T22:45:53.637 回答
5

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

[(x[k+1]-x[k])>0 for k in range(len(x)-1)].count(True) == len(x)-1
于 2013-11-11T22:43:22.540 回答
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 {{1}}
    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。此外if not run_started,也永远不会调用 final。您的代码按照设计的工作方式工作,尽管可能不是您希望的工作方式。高温高压

于 2013-11-11T21:29:58.743 回答
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

例如:

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

例如:

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。(留给读者练习……)

于 2013-11-11T21:55:20.383 回答