Форум сайта python.su
>>> def get_number_digit(number, count): ... assert count > 0 ... return number // 10 ** (count - 1) % 10 ... >>> def get_number_digits(number): ... if number == 0: ... yield 0 ... return ... while number > 0: ... yield number % 10 ... number //= 10 ... >>> def f(): ... return (i for i in range(10000, 99999 + 1) ... if i % 2 == 0 ... and get_number_digit(i, 3) % 2 != 0 ... and sum(get_number_digits(i)) % 4 == 0) ... >>> list(f())[:10] [10102, 10106, 10120, 10124, 10128, 10142, 10146, 10160, 10164, 10168] >>>
Отредактировано py.user.next (Ноя. 11, 2017 01:18:52)
Офлайн
py.user.next
спасибо. (yield 0 во второй функции не обязателен наверное).
Оказывается, можно еще так решить:
lst = [] for i in range(10000, 99999): if i % 2 == 0: lst.append(i) def digits_recursive(n, digits=[]): return digits_recursive(n // 10, [n % 10] + digits) if n else sum(digits) % 4 == 0 and digits[2] % 2 != 0 print(list(filter(digits_recursive, lst)))
Отредактировано Franek (Ноя. 11, 2017 18:27:30)
Офлайн
FranekНе, эта функция является общей функцией. Это значит, что она написана так, чтобы решать тысячи разных задач.
спасибо. (yield 0 во второй функции не обязателен наверное).
>>> def get_number_digits(number): ... if number == 0: ... yield 0 ... return ... while number > 0: ... yield number % 10 ... number //= 10 ... >>> lst = [1, 2, 3, 0, 123984, 987239, 0, 897234] >>> out = list(map(list, map(get_number_digits, lst))) >>> out [[1], [2], [3], [0], [4, 8, 9, 3, 2, 1], [9, 3, 2, 7, 8, 9], [0], [4, 3, 2, 7, 9, 8]] >>>
Отредактировано py.user.next (Ноя. 12, 2017 02:46:15)
Офлайн
Franek с какой целью решил улучшать код? Какой параметр интересует?
Улучшать можно:
1 читаемость кода
2 скорость выполнения
3 минимизация числа строк
4 минимизация потребления памяти
5 универсальность
Возможно есть еще варианты.
Вариант 1-2 тебя не интересует, т.к. реализация на простых форах, ифах и быстрее и наглядней. Варианты 4-5 тебе показали.
Остался только 3 пункт:
# на строках li=[x for x in range(10000,100000,2) if int(str(x)[2])%2 and not sum(map(int,list(str(x))))%4 ] # на цифрах li=[x for x in range(10000,100000,2) if (x//100)%2 and not sum([(x//10**i)%10 for i in range(5)])%4 ]
g=(x for x in range(10000,100000,2) if (x//100)%2 and not sum([(x//10**i)%10 for i in range(5)])%4 ) # 1 print(next(g)) print(next(g)) # 2 for i, item in enumerate(g): if i>=10: break print(i) # 3 print(list(g))
Офлайн
Посмотрел три предложеных решения задачи, с перестановкой местами цифр наибольшей и наименьшей. Два из этих решений не рабочие, а именно вариант от Franek и Rodegast. Достаточно подставить другое число, например: 8812.
Мой вариант:
s='8812' l=list(s) l.pop(s.index(min(s))) l.insert(s.index(min(s)),max(s)) l.pop(s.index(max(s))) l.insert(s.index(max(s)),min(s)) print(''.join(l))
s='8812' l = list(s) imin=l.index(min(l)) imax=l.index(max(l)) l[imin], l[imax] = l[imax], l[imin] print("".join(l)) # или так l = list(s) l[s.index(min(s))], l[s.index(max(s))] = l[s.index(max(s))], l[s.index(min(s))] print("".join(l))
Офлайн