2016-04-04 22 views
-1

Ich habe eine Liste von Oktalzahlen, die ich in Dezimal konvertieren möchte. Hier ist meine Klasse mit dem, was ich bisher getan:Algorithmus zur Umwandlung von Oktalzahlen in Dezimalzahlen?

class Octal: 

    #Reads in the file into numberList, converting each line into an int. 
    def __init__(self): 
     list = [] 
     file = open("Number Lists/random_numbers3.txt") 
     for line in file: 
      list.append(int(line)) 
     self.numberList = list 
     file.close() 

    #Convert numberList to decimal 
    def dec_convert(self): 
     decimal = 0 
     decimalList = [] 
     for line in self.numberList: 
      temp = str(line) 
      i = 0 
      while i < len(temp): 
       digit = int(temp[i]) 
       item = (digit * (8 ** (len(temp) - i))) 
       decimal = decimal + item 
       i += 1 

      decimalList.append(decimal) 
     return decimalList 



    def get_list(self): 
     return self.numberList 

ich in den Zahlen aus einer Datei zu lesen, die gut funktioniert. Aber ich glaube nicht, dass meine Funktion dec_convert() tatsächlich funktioniert. Es läuft einfach weiter und endet nicht.

Es sieht komplett schrecklich und schwer zu lesen, also fragte ich mich, ob es eine einfachere Möglichkeit gab, jede Oktalzahl in der Liste in eine Dezimalzahl umzuwandeln?

+4

kann man einfach nicht 'verwenden int (num_str, Basis)' die Konvertierung zu tun? zum Beispiel 'int ("23", 8)' gibt 19, die die Zeichenfolge "23" als oktal interpretiert ist. –

+0

Wo tun Sie erhöhen "i" in der "while" -Schleife. Kein Wunder, "es läuft weiter." –

+0

@TomKarzes, konvertiert das nicht von Dezimal zu Oktal? Ich brauche Oktal zu Dezimal. –

Antwort

1

Hier ist eine einfache Lösung, die die integrierten in int() Konstruktor verwendet eher Ihre dec_convert() Funktion.

class Octal: 
    def __init__(self): 
     with open("Number Lists/random_numbers3.txt") as fp: 
      self.numberList = map(lambda x:int(x,8), fp) 
    def get_list(self): 
     return self.numberList 

if __name__=="__main__": 
    o = Octal() 
    print(o.get_list()) 
+0

Aber konvertiert nicht "int (x, 8)" es in oktal? Ich brauche es von Oktal bis Dezimal. –

+0

Nein, das 'int (x, 8)' konvertiert FROM oktal in 'int'. Versuchen Sie dieses Experiment, um zu sehen, wie es funktioniert: 'print (int ('20', 8))'. Sie sollten sehen, dass der Oktal-String ' '20'' in einen int mit einem Wert von 16 –

+0

Ich sehe umgewandelt wird, so dass so etwas wie (Oktal) 7777 (Dezember) 4095 umwandeln würde? –

0

Ja, könnten Sie Liste Verständnis verwenden:

def dec_convert(self): 
    decimalList = [self._convert_to_dec(line) for line in self.numberList] 

und mit:

def _convert_to_dec(self,dec) : 
    n = len(temp)-1 
    return sum(int(x)*(8**(n-i)) for i,x in enumerate(dec)) 

Der erste Codefragment ist eine einfache Liste Verständnis, dass self._convert_to_dec auf alle Elemente in `Selbst ruft .numberList. Nicht viel Magie dort.

Die _convert_to_dec ist komplizierter: wir berechnen zuerst die Anzahl der Ziffern und speichern sie in n. Als nächstes definieren wir einen Generator, enumerate s über die Zeichen und bindet i an den entsprechenden Index. Der Generator multipliziert jedes Element mit der entsprechenden Potenz von 8 und der Ziffer. Dies ist ein Generator, also wird keine echte Liste erstellt.

Durch Ausführen dieses durch sum erhalten wir die Summe, die das angeforderte Ergebnis ist.

Oder wie @TomKarzes sagt, können Sie int mit einer bestimmten Basis (in diesem Fall 8 verwenden.