Я бы, вероятно, разделил его на две части:
m = min(x for x in l if x is not None)
s = (m, l.index(m)) # this will grab the first index
Если вы хотите составить список за один проход + одно линейное решение:
midx, mval = min(enumerate(x if x is not None else float('inf') for x in l), key=lambda i: i[1])
Произведение enumerate()
итерация, подобная следующей:
0 2.0
1 inf
2 3.0
3 1.0
4 inf
5 2.0
6 inf
7 5.0
Затем вызывается min()
и использует возврат enumerate()
с lambda
для проверки значений в индексе i[1]
(например, 2.0, inf, ..., 5.0
).Таким образом, окончательный кортеж возвращается только с одной итерацией с использованием генератора из исходного списка для «фильтрации и замены» индексов NoneType
.