2016-10-17 9 views
2

私は整数のみを含むリストを持っています。リスト内のすべての数字が連続しているかどうかを確認したいのです(数字の順序は関係ありません)。リスト内の連続する数字のテスト

繰り返し要素がある場合、関数は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

例リストは連続していません - それは連続した整数に並べ替えることができます。リストを並べ替えることはできますか? @DanielleM。 –

+1

順序は関係ありません – MMF

+0

よく見えますが、ifを取り除いて全体の式を返してください –

答えて

4

別の解決されています。しかし、あなたのソリューションを使用すると、メモリ内の全範囲を格納しないよう、おそらく優れている

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

。あなたはいつも

return boolean_expression 
+0

Nice one Julien;) – MMF

+0

'' return test'は 'test'がブール値である限り等しいと付け加えます。そうでなければ' bool'を呼び出さなければなりません。 –

+0

@FranciscoCouzoそれは本当です。 。 –

1

あなたは要素を見て何回の面でより良いアプローチによって

if boolean_expression: 
    return True 
else: 
    return False 

を簡素化することができます

を見つける組み込むことであろう最大の短絡は、すべてのデュープを1回で通過しますが、おそらく組み込み関数の速度で打ち負かされます入力によっては次のようになります。

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 
関連する問題