2016-10-17 7 views
2

Ich habe eine Liste, die nur ganze Zahlen enthält, und ich möchte überprüfen, ob alle Zahlen in der Liste aufeinanderfolgen (die Reihenfolge der Zahlen ist egal).Test für fortlaufende Nummern in der Liste

Wenn wiederholte Elemente vorhanden sind, sollte die Funktion False zurückgeben.

Hier ist mein Versuch, dieses Problem zu lösen:

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 

Zum Beispiel:

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

print(isconsecutive(l)) 

True 

Ist dies der beste Weg, dies zu tun?

+0

Ihre Beispielliste ist nicht aufeinander folgend - es kann in aufeinanderfolgenden Ganzzahlen neu geordnet werden, ist das was du meinst? Können wir die Liste neu anordnen? –

+1

@DanielleM. Die Reihenfolge ist egal – MMF

+0

Sieht gut aus, aber Sie sollten die if entfernen und nur den gesamten Ausdruck zurückgeben –

Antwort

4

ist hier eine andere Lösung:

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

jedoch Ihre Lösung ist wahrscheinlich besser, wie Sie den gesamten Bereich im Speicher nicht gespeichert werden.

Beachten Sie, dass Sie immer

if boolean_expression: 
    return True 
else: 
    return False 

von

return boolean_expression 
+0

Nice one Julien;) – MMF

+0

Ich würde hinzufügen, dass "Return-Test" ist gleich, solange "test" ist ein boolean, sonst werden Sie 'bool' anrufen müssen –

+0

@FranciscoCouzo das ist wahr, ich habe gerade eine Bearbeitung . –

1

Ein besserer Ansatz in Hinblick darauf, wie oft vereinfachen können Sie die Elemente betrachten, wäre zu übernehmen finden, die min, max und Kurzschluss auf alle Dupe alle in einem Durchgang, obwohl würde wahrscheinlich von der Geschwindigkeit der eingebauten Funktionen geschlagen werden Ons abhängig von den Eingaben:

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 
Verwandte Themen