Добавить целое число из списка при выполнении условия - PullRequest
0 голосов
/ 16 сентября 2018

Итак, если я хочу определить первые 20 (не до 20) чисел Харшарда, как бы я это сделал?Код у меня только вводится, пока не достигнет 20, а не первых 20.

def isHarshad(x):
x1 = str(x)
x2 = list(x1)
x3 = [int(i) for i in x2]
x4 = sum(x3)
if x%x4 == 0:
    return True
else:
    return False

def ithHarshad(n):
return [i for i in range(1, n+1) if isHarshad(i)]

ithHarshad(20) 

Ответы [ 6 ]

0 голосов
/ 16 сентября 2018

Вы получите ZeroDivisionError, если вы поделите что-то на ноль. В вашем коде единственное деление происходит, когда вы используете оператор по модулю. Если число, которое вы передаете isHarshad(), равно 0, то вы получите эту ошибку. Также нет необходимости преобразовывать int в список символов, вы можете реализовать isHarshad(), используя чистую целочисленную арифметику:

def isHarshad(x):
  sum = 0
  y = x
  while y:
    sum += y % 10
    y //= 10
  return sum != 0 and x % sum == 0

Делая это таким образом, вы также можете легко изменить функцию, чтобы определить, является ли число числом Харшада в другой базе, отличной от 10.

0 голосов
/ 16 сентября 2018

У вас возникла логическая ошибка. Просто измените

r.remove(y1) 

до

y1.remove(r) in function ithHarshad()

Это бы сработало!

0 голосов
/ 16 сентября 2018

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

if not isHarshad(x):
    y1.remove(r)

Я изменил ваше условие, чтобы сделать его более питонным: при сравнении с логическими значениями вам не нужно записывать его явно.Таким образом, в этом случае, если isHarshad возвращает True, not инвертирует его, и приведенный ниже код не выполняется, но когда он возвращает false, он инвертируется в True, и элемент удаляется.

В общем, вы могли бы действительно сократить свой код, если бы использовали понимание списка:

def ithHarshad(n):
    return [i for i in range(1, n+1) if isHarshad(i)]

Этот код означает, что он создаст список значений 1 -> n (включительно) ивключайте значение только в том случае, если результат фильтрации через isHarshad равен True

0 голосов
/ 16 сентября 2018

Не лучший код, но это работает:

def isHarshad(x):
    x1 = str(x)
    x2 = list(x1)
    x3 = [int(i) for i in x2]
    x4 = sum(x3)
    if x%x4 == 0:
        return True
    else:
        return False

def ithHarshad(y):
    y1 = []
    for i in range(y):
        y1.append(i+1)
    for r in y1:
        if not isHarshad(r):
            print('r: %s; y1:%s' % (r, y1))
            y1.remove(r)
    return y1

if __name__ == "__main__":
    result = ithHarshad(13)
    print('Result for ithHarshad(13) = %s' % result
0 голосов
/ 16 сентября 2018

y1 - ваш список, а r - ваше целое число в этом списке.Вы должны удалить из списка.

0 голосов
/ 16 сентября 2018

Вы пишете напротив во втором цикле

for r in y1:
  if isHarshad(r) == False:
     y1.remove(r) # You wrote r.remove(y1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...