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 шт):
способ 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]