测试列表中的连续数字

时间:2016-10-17 16:44:31

标签: python list python-3.x

我有一个只包含整数的列表,我想检查列表中的所有数字是否连续(数字的顺序无关紧要)。

如果有重复的元素,该函数应返回False。

我试图解决这个问题:

def isconsecutive(lst):
    """ 
    Returns True if all numbers in lst can be ordered consecutively, and False otherwise
    """
    if len(set(lst)) == len(lst) and max(lst) - min(lst) == len(lst) - 1:
        return True
    else:
        return False

例如:

l = [-2,-3,-1,0,1,3,2,5,4]

print(isconsecutive(l))

True

这是最好的方法吗?

2 个答案:

答案 0 :(得分:4)

这是另一种解决方案:

def is_consecutive(l):
    setl = set(l)
    return len(l) == len(setl) and setl == set(range(min(l), max(l)+1))

但是,您的解决方案可能更好,因为您不会将整个范围存储在内存中。

请注意,您可以随时简化

if boolean_expression:
    return True
else:
    return False

通过

return boolean_expression

答案 1 :(得分:1)

就您查看元素的次数而言,更好的方法是找到 min max 短路在任何一次通过的任何欺骗中,虽然可能会受到内置函数的速度的影响,具体取决于输入:

def mn_mx(l):
    mn, mx = float("inf"), float("-inf")
    seen = set()
    for ele in l:
        # if we already saw the ele, end the function
        if ele in seen:
            return False, False
        if ele < mn:
            mn = ele
        if ele > mx:
            mx = ele
        seen.add(ele)
    return mn, mx

def isconsecutive(lst):
    """
    Returns True if all numbers in lst can be ordered consecutively, and False otherwise
    """
    mn, mx = mn_mx(lst)
    # could check either, if mn is False we found a dupe
    if mn is False:
        return False
    # if we get here there are no dupes
    return mx - mn == len(lst) - 1