python почему не работает код?

нужно вывести числа в интервале 70 и 120, но все числа в нем должны быть нечетными допустим: 71 = 7 - нечетный, 1 - нечетный (71 - выводим на экран), или например 81 = 8 четный, 1 - нечетный (81 - не выводим на экран) и нужно чтобы все цифры были четными, если в цифре 0 то пропускаем

x = '70'
x1 = x[0]
x2 = x[1]
y = '120'

while int(x) > 100:
    if int(x1) % 2 == 1 or int(x2) % 2 == 1:
        print(x)
        x = int(x) + 1
    else:
        x = int(x) + 1

и как можно код сделать еще короче(оптимизировать)?


Ответы (2 шт):

Автор решения: Zhihar

способ 1:

вот так можно решить (если я правильно понял условие):

for value in range(70, 121):
    # перевести число в текст
    text = str(value)

    # из текста получить список цифр (каждую букву текста перевести в цифру)
    digits = map(int, text)

    # проверить каждую цифру на условие являются ли все цифры нечетными (или нулем)
    checks = map(lambda i: i == 0 or i % 2 == 1, digits)

    # проверить, являются ли все цифры нечетными (или нулем)
    result = all(checks)

    # вывести число, если оно удовлетворяет критерию
    if result:
        print(value)

способ 2:

ну или если вы являетесь любителем решения в одну строчку:

print(*[value for value in range(70, 121) if all(map(lambda i: i == 0 or i % 2 == 1, map(int, str(value))))], sep='\n')

способ 3:

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

for value in range(70, 121):
    # из числа получить список цифр
    digits = []
    tmp = value

    while tmp != 0:
        digits.append(tmp % 10)
        tmp //= 10

    # проверить каждую цифру на условие являются ли все цифры нечетными (или нулем)
    checks = map(lambda i: i == 0 or i % 2 == 1, digits)

    # проверить, являются ли все цифры нечетными (или нулем)
    result = all(checks)

    # вывести число, если оно удовлетворяет критерию
    if result:
        print(value)

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

for value in range(70, 121):
    # из числа получить список цифр
    tmp = value
    is_found = True

    while tmp != 0:
        digit = tmp % 10
        tmp //= 10

        is_found = False if digit % 2 == 0 and digit != 0 else is_found

    # вывести число, если оно удовлетворяет критерию
    if is_found:
        print(value)

способ 4:

опять через строки, но использование множеств дает возможность создания очень коротких решений:

for value in range(70, 121):

    a = set(map(int, str(value)))
    if len(a - set([2, 4, 6, 8])) == len(a):
        print(value)

способ 5:

то же самое, но в одну строку:

print(*[value for value in range(70, 121) if len(set(map(int, str(value))) - set([2, 4, 6, 8])) == len(set(map(int, str(value))))], sep='\n')

способ 6:

можно использовать регулярные выражения, чтобы найти запрещённые цифры:

import re
for value in range(70, 121):
   if re.search(r'[2468]', str(value)) == None:
       print(value)
→ Ссылка
Автор решения: Владислав Харламов
from itertools import product

digits = '13579' # Цифры из которых составляем числа
start, end = 70, 120 # В каком диапазоне ищем

total_numbers = [] # Инцилизируем список, где будет храниться все искомые числа

for n_digit in [2, 3]: # Сколько цифр может быть в числе
    total_numbers.extend(
        list(
    filter(lambda x: x >= start and x <= end, # Фильтруем числа в нужном диапазоне
       map(lambda x: int(''.join(x)), 
           product(digits, repeat=n_digit))))
    )
    
print(total_numbers) # [71, 73, 75, 77, 79, 91, 93, 95, 97, 99, 111, 113, 115, 117, 119]
→ Ссылка