布尔运算符似乎不适用于升序列表功能

时间:2019-05-18 06:34:13

标签: python for-loop

所以问题如下,我需要创建一个检查列表是否升序的函数。如果是,则该函数必须返回True。此外,如果列表由零个元素或一个元素组成,则它必须返回True。如果列表未升序,则必须返回False。

我尝试使用类似的代码,但是我使用了while循环和计数器来代替for循环,但仍然无法使函数正常工作。

def is_ascending(items): 
    if len(items) == 0 or len(items) == 1:
        return True 
    for i in list(range(len(items))):
        if items[i] >= items[i + 1]:
            return False
            break
        else:
            return True

我已经尝试了以下带有以下列表的代码

预期结果

[-5、10、99、123456]:对

[2,3,3,4,5]:错

[99]:是

[]:是

[4、5、6、7、3、7、9]:错误

[1,1,1,1]:错误

意外结果

[-5、10、99、123456]:对

[2,3,3,4,5]:对--这应该是错误的

[99]:是

[]:是

[4、5、6、7、3、7、9]:对--这应该是错误的

[1,1,1,1]:错误

3 个答案:

答案 0 :(得分:1)

您可以在列表上使用set + sorted并与原始列表进行比较:

def is_ascending(items): 
    return sorted(set(items)) == items

问题您的代码:

  • 它会根据第一项是否大于或等于第二个,在第一次迭代中本身返回True / False。您从未比较所有元素。

更正的代码

def is_ascending(items): 
    if len(items) == 0 or len(items) == 1:
        return True 
    for i in range(len(items) - 1):
        if items[i] >= items[i + 1]:
            return False
    return True

答案 1 :(得分:1)

pythonic方法是比较压缩的元组,这可能比for循环和索引更易于阅读和推理。如果值有误,它也会在长列表上提前保释(就像您当前的想法一样):

def is_ascending(items): 
    return all(i < j for i, j in zip(items, items[1:]))


is_ascending([2, 3, 3, 4, 5])  # False
is_ascending([99])             # True
is_ascending([2, 3, 4, 5, 15]) # True

答案 2 :(得分:0)

您的逻辑是正确的。只需检查以下更正,即可正常工作。

  1. 检查for循环中的范围
  2. return True必须在其他地方。

在其他情况下返回True的情况下,如果第一个数字小于第二个,则条件返回,因此不检查列表中的其他数字。

通过以下更改检查代码:

def is_ascending(items): 
    if len(items) == 0 or len(items) == 1:
        return True 
    for i in list(range(len(items) - 1)):
        if items[i] >= items[i + 1]:
            return False
            break
    return True

希望这会有所帮助!