想想Python第10章练习6

时间:2014-04-17 23:24:38

标签: python sorting python-2.7 python-3.x

练习:

  

编写一个名为is_sorted的函数,该函数将列表作为参数,如果列表按升序排序,则返回True,否则返回False。您可以假设(作为前提条件)列表的元素可以与关系运算符<>等进行比较。

     

例如,is_sorted([1,2,2]) return Trueis_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。我如何更改它以使其有效?

5 个答案:

答案 0 :(得分:1)

该行

for i in stuff:

通过迭代,而不是 indices 。如果您先放置58,则会获得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 stufffor i in range(len(stuff))混为一谈。

stuff = ['a', 'b', 'c', 'd']

  1. 使用for item in stuff,您将遍历stuff中的每个项目:&#39; a&#39;&#39; b&#39;,&# 39; c&#39;和&#39; d&#39;

  2. 使用for i in range(len(stuff)),您将遍历stuff的每个索引:0,1,2,3。

  3. 请注意,变量名称itemi是这些语句的常见约定,但不是必需的 - 您可以将itemi替换为您想要的任何内容。因此,您的第二行代码(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!"