因此,我应该编写一个函数,如果所述序列从最小到最大排列,则返回true。我能够理解字符串和num列表,但是对于一个空列表,我无法理解为什么它不会返回true。
这是为了了解并可能帮助我理解如何更好地操纵循环。
def is_sorted(seq):
for i in range(0, len(seq)):
if seq[i]<seq[i+1]:
return True
else:
return False
print(is_sorted([])) # expected to be true but returns none
答案 0 :(得分:3)
一个明显的问题是,如果列表为空,您将返回None
,其结果为false。另一个问题是您在循环内使用return
,这意味着您没有评估可迭代对象中的每个序列。
@hiro主角的答案是解决此问题的一种方法。我提供了使用all
和生成器表达式的替代方法。
def is_sorted(seq):
return all(seq[i] < seq[i + 1] for i in range(len(seq) - 1))
# All evaluate True
print(is_sorted(['a', 'b', 'c']))
print(is_sorted([1, 2, 3]))
print(is_sorted([]))
# Both evaluate False
print(is_sorted(['a', 'c', 'b']))
print(is_sorted([0, 1, -1]))
据我所知,all
的工作方式是逐步遍历一个可迭代对象,如果其中的任何值等于False
,则返回False
,否则返回True
。
正如评论所示,我对Python生成器没有很好的理解。生成器是一个可迭代的对象,它计算下一个值,并在每次引用它时将其返回。
上面定义的生成器,每次all
引用它时,都会计算seq[i] < seq[i + 1]
并将该值返回。如果任何时候都是False
,则all
将返回False
。
我希望这会有所帮助。我确信评论中的好人之一将纠正我的任何有误的理解。
答案 1 :(得分:1)
您的实现是错误的。因为它仅比较前两个元素(在第一次迭代后返回True
,所以它将为[1, 3, 2]
返回return
。
可以通过检查相反的条件然后在循环后return True
来解决此问题。
您还应该迭代直到len(seq) - 1
,否则最后一次迭代将导致IndexError
。
def is_sorted(seq):
for i in range(0, len(seq) - 1):
if seq[i] > seq[i + 1]:
return False
return True
print(is_sorted([1, 2, 3]))
# True
print(is_sorted([1, 3, 2]))
# False
print(is_sorted([]))
# True
当然有一个简单的天真解决方案,
def is_sorted(seq):
return seq == sorted(seq)
答案 2 :(得分:1)
这是一个变体,也适用于空列表和长度为1的列表。
from itertools import islice
def is_sorted(seq):
return all(i <= j for i, j in zip(seq, islice(seq, 1, None)))
它使用zip
和islice
在seq[k]
和seq[k+1]
上进行迭代。并且仅当all
个元素满足True
的条件时才会返回。
答案 3 :(得分:0)
这是因为对于空列表,未到达for内的代码。因此都没有返回语句。此外,您还应考虑到只有一个元素的列表也应返回True。解决方案:
def is_sorted(seq):
for i in range(0, len(seq)-1):
if seq[i]>=seq[i+1]:
return False
return True