我在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)
答案 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
计算。 (留给读者练习......)