Возможные примеры решения с нахождением функции min
Имеется поток данных о ценах товаров (считайте, что цена всегда больше 0). Необходимо написать алгоритм определения минимального четного числа в этом потоке.
sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37, 96, 8547]
x = min([pirce for pirce in sys_stdin if pirce % 2 == 0])
print(x)
Подскажите какими ещё способами можно решить эту задачу?
Пробую решить данным способом
sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37,
96, 8547]
num = [0]
for min_num in sys_stdin:
if min_num % 2 == 0:
print(min_num)
select = min(min_num)
print(select)
, но выдаёт ошибку
select = min(min_num)
TypeError: 'int' object is not iterable
Ответы (4 шт):
Автор решения: Bol4onok
→ Ссылка
Можете вот так:
sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37,
96, 8547]
answ = float('inf')
for min_num in sys_stdin:
if min_num % 2 == 0 and min_num < answ:
answ = min_num
print(answ)
Или вот так:
answ_1 = min(map(lambda x: x if x % 2 == 0 else float('inf'), sys_stdin))
print(answ_1)
Вывод в обоих случаях:
16
Автор решения: Сергей
→ Ссылка
Там еще исправления желательны в вашем варианте - дал комментарии ниже:
sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37,
96, 8547]
# Зачем этот список?
num = [0]
# Переменная для сравнения - делаем максимальной
select=1000000
for min_num in sys_stdin:
# чуть изменили
if not min_num % 2:
print(min_num)
# Исправлено сравнение, вызов min был неверен
select = min (min_num, select)
print(select)
Автор решения: TigerTV.ru
→ Ссылка
Вариант с reduce:
from functools import reduce
sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37, 96, 8547]
res = reduce(lambda s, x: x if s > x and (x % 2 == 0) else s, sys_stdin)
print(res)
или без:
sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37, 96, 8547]
res = sys_stdin[0]
for inp in sys_stdin:
if res > inp and (inp % 2 == 0):
res = inp
print(res)
A можно сделать еще проще и использовать filter и min:
res = min(filter(lambda x: not (x % 2), sys_stdin))
print(res)
Автор решения: vadim vaduxa
→ Ссылка
# но при n==1 лучше использовать min()
import heapq
min_num = heapq.nsmallest(n=1, iterable=(x for x in sys_stdin if not x % 2))[0]
# такой вариант уже был, но все писали его в более длинном виде
min_num = min(x for x in sys_stdin if not x % 2)