我有一个只包含整数的列表,我想检查列表中的所有数字是否连续(数字的顺序无关紧要)。
如果有重复的元素,该函数应返回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
这是最好的方法吗?
答案 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