Think Python Exercise 10.5

编写一个叫做is_sorted的函数,接受一个列表作为参数,如果列表是递增排列的则返回 True ,否则返回False。 例如:

>>> is_sorted([1, 2, 2])
True
>>> is_sorted(['b', 'a'])
False

分析:

可以先对列表用.sort()方法进行递增排列,如果递增排列后的列表和原列表的元素都对应相同,说明原列表本身就是递增排列的。

一个错误的写法:

1
2
3
4
5
6
7
8
9
def is_sorted(t):
    t_copy = t[:]
    print(t_copy)
    if t_copy == t.sort():
        return True
    else:
        return False

is_sorted([1, 2, 2])

程序没有报错,但它仍是错的,因为,我们要比较的是两个列表里的元素对应相同,而不是看这两个变量是不是指向同一个列表。t_copy和t.sort()肯定不指向同一个列表,但它们的元素对应相同。因此我们不能用t_copy == t.sort()这样的方法来比较。可以这样做:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def is_sorted(t):
    t_copy = t[:]
    for i in range(len(t)):
        if t_copy[i] == t[i]: 
        #如果递增排列后的列表和原列表的元素都对应相同,说明原列表本身就是递增排列的
            pass
        else:
            return False
    return True

is_sorted([1, 2, 2])

还可以用另一种方法实现:从第二个元素开始,依次和前面一个元素比较大小。

字符串也可以进行大小比较。英文字母按字母顺序从小到大;所有的大写字母在小写字母前面,所以如果进行大小比较的话,'A'<'Z'<'a'<'z'

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def is_sorted(t):
    for i in range(1,len(t)): #从1开始,而不是从0开始生成序列
        if t[i] >= t[i-1]:
        #如果从第二个元素开始,每一个元素都比它前面一个元素大,说明这个列表就是递增的
            pass
        else:
            return False
    return True

is_sorted([1, 2, 2])