2016-04-09 2 views
3

Я пытаюсь сделать программу, которая проверяет положительное целое число на базовое значение и возвращает значение True, если все цифры номера строго меньше, чем base, а false в противном случае. Некоторые из выходов я Достигнутые:Validating Base Number

>>> base_and_number(12345, 2) 
    False 
    >>> base_and_number(12345, 8) 
    True 
    >>> base_and_number(9, 5) 
    False 
    >>> base_and_number(10110, 2) 
    True 

Это, безусловно, правильно, и я сделал этот код, чтобы убедиться в этом. Проблема в том, что я не уверен, что я подхожу к ней наилучшим образом, так как я хочу найти гораздо более эффективный способ оценки валидации базовых чисел. Вот он:

def base_and_num(number, base): 
     int_list = [] 
     for digit in str(number): 
      int_list.append(int(digit)) 

     result = [] 
     for i in range(len(int_list)): 
      if int_list[i] < base: 
       result.append(int_list[i]) 

     if len(result) == len(str(number)): 
      return True 
     else: 
      return False 

Есть ли более простой способ сделать это? Я чувствую, что есть намного более очевидный способ сделать это, но я не могу понять это.

ответ

2

Один из вариантов:

def base_and_num(number, base): 
    for i in str(number): 
     if base <= int(i): 
      return False 
    return True 
+1

вы просто (случайно) скопировали по коду :) –

+0

Это на самом деле кажется самым простейший подход. Мне это нравится. Наверное, я просто слишком усложнил это, но опять же. – RoadRunner

+0

извините, я не понимаю, что вы имеете в виду @Marcus Müller – Zorgmorduk

1

Вы можете использовать список понимания, чтобы упростить код:

def base_and_num(number, base): 
    return all([str(base)>digit for digit in str(number)]) 

, используя тот факт, что порядок ASCII совместит с естественным порядком.

+0

Thanks man @B. M. – RoadRunner

1

Ну ..

def base_and_num(number, base): 
    return all(int(digit) < base for digit in str(number)) 
+0

Спасибо! @DeepSpace – RoadRunner

2

Попытка преобразовать его и посмотреть, если это не удается.

try: 
    int(str(number), base) 
except ValueError: 
    print('{} is invalid base for {}'.format(base, number)) 

Демо:

>>> number = 456 
>>> base = 7 
>>> int(str(number), base) 
237 
>>> base = 3 
>>> int(str(number), base) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 3: '456' 
+1

Хотя они использовали термин 'base', это не совсем то, что OP хотел достичь :) – DeepSpace

+0

@DeepSpace, как это не так? – timgeb

+0

На самом деле вы на месте, я стою исправлено – DeepSpace

1

Пытаясь остаться немного истинного для вашего кода (я бы сделал это с reduce, но, да ладно, я не думаю, что мы должны объяснить этот подход здесь).

Да, есть; прежде всего, ваш else: continue является избыточным. Вы можете просто опустить это.

Я бы сказал, return False, как только вы встретите свою первую цифру, превышающую base. И если вы не вернетесь False, return True. Что-то вроде

def base_and_num(number, base): 
    number = int(number) ## making sure we don't break on floats, strings etc. 
    while number != 0: 
     digit = number % 10 #modulo 
     if digit > base: 
      return False #function exits here! 
     number = number/10 #integer division 
    return True 
+0

Спасибо @Marcus Muller, я ценю более разный подход. – RoadRunner

2

Вот один из способов:

def basecheck(number,base): 
    return all([int(x) < base for x in str(number)]) 
+1

Я вижу, что мы все на одной и той же длине волны здесь! – beroe

+0

Да, спасибо, я все время забываю о методе all(), который так удобен в этой ситуации. – RoadRunner

+1

Предложение: Используйте 'any' вместо всех и отрицайте чек. – Markus

1

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

  1. Вам не нужен дополнительный целочисленный список, вы можете напрямую перебирать строку в python.

  2. Возвратите false, как только вы столкнетесь с цифрой, не соответствующей вашим критериям. Если их нет, верните true.

+0

Cheers благодарит человека, я до сих пор счастлив, что я все еще могу ответить хотя хаха, хотя это может быть худший ха-ха: P – RoadRunner

1

Альтернативный способ позволить Python сделать работу для вас. Преобразуйте число в строку, затем попробуйте преобразовать его обратно в целое число с использованием указанной базы. Python будет бросать ValueError, если какая-либо цифра равна или превышает базовую.

def base_and_number(number, base): 
    try: 
     int(str(number), base) 
    except ValueError: 
     return False 
    else: 
     return True 

Это работает как с отрицательными целыми, так и с положительными, что ответы, строго сравнивающие отдельные цифры, не будут.

+0

Спасибо @kindall. Вы даете отличные ответы для нового программиста на языке python. Я ценю этого человека :) – RoadRunner