2016-05-30 11 views
0

Die folgende [unvollständig] Code ausgelegt ist, in ein n-x Anzahl, der Länge x-n und geben den Wert der nächsten Pandigitale Zahl zu nehmen. Der Code gibt an, welche Zahl zwischen und x von der als Argument für die Funktion übergebenen Zahl fehlt und gibt (vorerst bis zur Funktionsentwicklung) zwei Listen zurück, die ursprüngliche Zahl selbst mit seinen einzelnen Ziffern als Mitglieder einer Liste und einer Liste mit den Nummern n zu x als Mitglieder mit den Zahlen, die in der ursprünglichen Anzahl der Länge vorhanden sind xndurch den booleschen Wert ersetzt wird Wahr.Python Listen anhängen Wahr Boolean

def nextPandigital(n,lower,upper): 
    digits = [] 
    requiredDigits = [] 

    #Completed loop 
    for digit in str(n): 
    digits.append(int(digit)) 

    #Completed loop 
    for num in range(lower,upper+1): 
    requiredDigits.append(num) 

    for number in requiredDigits: 
     if str(number) in str(digits): 
      x = requiredDigits.index(number) 
      #requiredDigits[x] = 'True' 
      requiredDigits[x] = True 
    return digits, requiredDigits 

Obwohl für die Eingangsparameter des nextPandigital(1023456789,0,9) in Enthought Canopy, die zweite Liste sollte [True,True,True,True,True,True,True,True,True,True] gelesen zurückgegeben, kehrte der Wert der zweiten Liste enthalten ist, in der Tat [True,1,True,True,True,True,True,True,True,True], mit der 1 aus das Original requiredDigits Liste wird nicht ersetzt durch True.

Ich weiß, dass es kein Problem mit der Schleife oder der allgemeine Ablauf des Codes, denn wenn die requiredDigits[x] = True Codezeile kommentiert wird, und der aktuell kommentierte Code ist unkommentiert, der Code funktioniert, wie es sollte, zu, wobei alle Ziffern in requiredDigits durch den String-Wert ersetzt ‚True.

ich habe dieses Problem zu lösen versucht. Ich bin jedoch nicht in der Lage, die Quelle zu bestimmen. Ich habe in Betracht gezogen, dass True == 1 True zurückgibt. Wenn der Wert True jedoch durch False ersetzt wird, funktioniert der Code in der Zeile requiredDigits[x] = True weiterhin wie vorgesehen.

Jede Antwort/Hilfe/Vorschlag/Beratung zu diesem Thema würde sehr geschätzt werden. Vielen Dank im Voraus.

+0

Ich sollte wahrscheinlich klarstellen: An * n * bis * x * Nummer bedeutet, dass die Zahl Frage enthält alle Ziffern von der angegebenen Nummer * n * zu der angegebenen Anzahl * x *. –

Antwort

0

Das Problem mitunter Verwendung 210 zu finden, wo Sie zuweisen möchten.Da True gleich 1 ist, denken Sie fälschlicherweise, dass die True, die Sie für 0 eingegeben haben, die 1 ist, die Sie als nächstes ersetzen möchten.

wäre eine Lösung enumerate zu verwenden, um Indizes zu erhalten, wie Sie über Ihre Liste iterieren, anstatt benötigen sie index später mit zu finden:

for x, number in enumerate(requiredDigits): 
    if str(number) in str(digits): 
     requiredDigits[x] = True 

Eine bessere Lösung im Allgemeinen eine Liste Verständnis zu verwenden wäre

requiredDigits = [True if num in digits else num for num in range(lower,upper+1)] 

ich auch loszuwerden unnötigen Anrufe str in der Mitgliedschaft Test aga: die Liste in einem Rutsch, anstatt mit Zahlen beginnen und ersetzt einige von ihnen später zu erstellen inst digits. Sie haben Teilstringtests durchgeführt, anstatt zu testen, ob die Zahlen selbst in der Liste waren. Das würde wahrscheinlich keine Fehler verursachen, da die Nummern, die Ihnen wichtig sind, alle eine Ziffer lang sind und die Zeichenfolgendarstellung einer Liste keine überflüssigen Ziffern enthält. Aber im Allgemeinen ist es keine gute Idee, String-Operationen zu verwenden, wenn Sie dies nicht benötigen.

+0

Danke für die Antwort. Es hat wirklich geholfen. Ich bin jedoch nicht in der Lage, den genauen Zweck von * enumerate * zu verstehen. Ordnet es einfach einen Platzwert, ähnlich einem Indexwert, für jedes Mitglied einer Liste oder macht es etwas mehr? –

+0

Die eingebaute Funktion 'enumerate' funktioniert auf jeder Art von iterierbar. Er wandelt die einzelnen Werte des Iterablen in "Index, Wert" 2-Tupel um. Sie können [Dokumentation] (https://docs.python.org/3/library/functions.html#enumerate) oder [PEP 279] (http://www.python.org/peps/pep-0279) lesen .html), die in Version 2.3 den Zusatz zu Python vorgeschlagen hat. – Blckknght

+0

Also, im Wesentlichen, * x, Zahl * sind die Variablen, die die zwei Werte des Tupels darstellen. –

0

Sie überprüfen die gleiche Liste, die Sie aktualisieren, und das ist immer gefährlich.

Bei der zweiten Iteration Ihre Variablen sind:

number=1 
requiredDigits = [True, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Also, wenn Sie requiredDigits.index(1) tun gibt es ein Spiel, aber es erreicht nicht die 1, da es in True==1 geschieht so gibt es, dass der Index 0

Aber im allgemeinen, diese Implementierung ist nicht viel pythonic, überprüfen Sie besser Blckknght's answer

+0

Diese Antwort half mir, das Grundproblem mit meinem Code zu verstehen und half mir, Blckknghts Antwort zu verstehen. Vielen Dank! –