2016-04-04 5 views
-1

У меня есть список восьмеричных чисел, которые я хочу преобразовать в десятичные числа. Вот мой класс с тем, что я сделал до сих пор:Алгоритм преобразования восьмеричных чисел в десятичные числа?

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 

Я прочитал в номера из файла, который работает отлично. Но я не думаю, что моя функция dec_convert() действительно работает. Он просто продолжает работать и не заканчивается.

Это выглядит совершенно ужасно и трудно читается, поэтому мне было интересно, был ли более простой способ преобразования каждого восьмеричного числа в список в десятичное число?

+4

Не можете ли вы использовать 'int (num_str, base)' для преобразования? Например, 'int (« 23 », 8)' возвращает 19, что является строкой «23», интерпретируемой как восьмеричная. –

+0

вы увеличиваете 'i' внутри цикла while. Неудивительно, что он продолжает работать. –

+0

@TomKarzes, разве это не преобразование из десятичного в восьмеричное? Мне нужно восьмеричное до десятичного. –

ответ

1

Вот простое решение, которое использует встроенный в int() конструктор скорее ваш dec_convert() функцию.

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

Но разве это не означает, что «int (x, 8)» преобразует его в восьмеричное? Мне нужно это от восьмеричного до десятичного. –

+0

Нет, что 'int (x, 8)' преобразует FROM восьмеричный TO 'int'. Попробуйте этот эксперимент, чтобы увидеть, как он работает: 'print (int ('20', 8))'. Вы должны увидеть, что восьмеричная строка '' 20'' преобразуется в int со значением 16. –

+0

Я вижу, так что бы преобразовать что-то вроде (восьмеричное) 7777 в (dec) 4095? –

0

Да, вы могли бы использовать список понимание:

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

и с:

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

Первый фрагмент кода представляет собой простой список понимание, что вызывает self._convert_to_dec на все элементы в `я .numberList. Там не так много волшебства.

_convert_to_dec сложнее: сначала вычислим количество цифр и сохраним его в n. Затем мы определяем генератор, который enumerate s над символами и связывает i с соответствующим индексом. Генератор умножает каждый элемент на соответствующую мощность 8 и цифру. Это генератор, поэтому никакого реального списка не создается.

Запустив его до sum, мы получим сумму, которая является запрошенным результатом.

Или, как @TomKarzes говорит, вы можете использовать int с данной базой (в данном случае 8.

 Смежные вопросы

  • Нет связанных вопросов^_^