练习:
编写一个名为
is_sorted
的函数,该函数将列表作为参数,如果列表按升序排序,则返回True
,否则返回False
。您可以假设(作为前提条件)列表的元素可以与关系运算符<
,>
等进行比较。例如,
is_sorted([1,2,2])
return True
和is_sorted(['b', 'a'])
应该return False
。
到目前为止,我有:
def is_sorted(stuff):
for i in stuff:
if stuff[i+1] > stuff[i]:
return True
else:
return False
numbers = [1, 0, 5, 2, 8]
print is_sorted(numbers)
但每当我更改数字列表时,似乎return True
。我如何更改它以使其有效?
答案 0 :(得分:1)
该行
for i in stuff:
通过项迭代,而不是 indices 。如果您先放置5
或8
,则会获得IndexError
。另外,你return
如果支票通过了第一件商品,那就太早了!如果任何出现故障,您可以return False
,但所有必须符合return True
。
相反,请尝试使用enumerate
同时获取项目和索引:
def is_sorted(stuff):
for index, item in enumerate(stuff):
try:
if item > stuff[index + 1]:
return False
except IndexError:
return True
或者,使用zip
进行成对比较:
def is_sorted(stuff):
return all(b >= a for a, b in
zip(stuff, stuff[1:]))
答案 1 :(得分:1)
for i in stuff
将枚举每个元素。你想要做的是枚举元素的索引,所以将循环更改为
for i in range(len(stuff))
接下来,如果遇到大于当前的后续元素,则不希望返回True。在测试每对相邻元素后返回True,如下所示:
def is_sorted(stuff):
for i in range(1,len(stuff)):
if stuff[i - 1] > stuff[i]:
return False
return True
答案 2 :(得分:0)
建立@ jonrsharpe的答案,
这是itertools
pairwise
食谱的绝佳应用:
from itertools import tee, izip
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None) #or b.next() on Python 2.5 and below
return izip(a, b)
def is_sorted(iterable):
return all(a <= b for a,b in pairwise(iterable))
这可以避免索引访问或切片,这使您可以对生成器进行操作并大大减少内存占用。
is_sorted(xrange(5000000))
不幸的是,对于像is_sorted(count(0))
答案 3 :(得分:0)
您好像将for item in stuff
与for i in range(len(stuff))
混为一谈。
说stuff = ['a', 'b', 'c', 'd']
。
使用for item in stuff
,您将遍历stuff
中的每个项目:&#39; a&#39;&#39; b&#39;,&# 39; c&#39;和&#39; d&#39;
使用for i in range(len(stuff))
,您将遍历stuff
的每个索引:0,1,2,3。
请注意,变量名称item
和i
是这些语句的常见约定,但不是必需的 - 您可以将item
和i
替换为您想要的任何内容。因此,您的第二行代码(for i in stuff
)正在执行上面的#1,而不是您期望的#2。
要让代码执行#2,您必须在第二行代码中使用range(len(stuff)
,而不只是stuff
。
答案 4 :(得分:0)
I know this is an old thread but I am trying to refine my solution to this problem.
I want to make sure no body sneaks in an integer or a string in a predominantly string or integer list resp. For instance, ['a', 'b', 2]
I wrote a python program for this but it seems to me it is getting a bit unwieldy. Is there any better solution to this?
def is_sorted(stuff):
is_int = 1
not_int = 0
if type(stuff[0]) == int:
of_type = is_int
else:
of_type = not_int
for i in range(1,len(stuff)):
if (of_type == is_int and (type(stuff[i - 1]) == int and type(stuff[i]) == int)) or \
(of_type == not_int and (type(stuff[i - 1]) == str and type(stuff[i]) == str)):
if stuff[i - 1] > stuff[i]:
return False
else:
print "I saw what you did there!"
return False
return True
print is_sorted(['b', 'a']) //False
print is_sorted(['a', 'b']) //True
print is_sorted([1, 2]) //True
print is_sorted(['a', 'b', 2]) //False; "I saw what you did there!"