Возможные примеры решения с нахождением функции 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)
→ Ссылка