Оптимизация кода. Условия if ... else:
Подскажите пожалуйста, как можно оптимизировать данные условия, чтобы код выглядел компактнее и не так убого. Вот сам код: ИСПРАВЛЕННЫЙ ВАРИАНТ!
if not sums1.values():
m1 = (0,0)
else:
m1 = max(sums1.items())
if not sums2.values():
m2 = (0,0)
else:
m2 = max(sums2.items())
if not sums3.values():
m3 = (0,0)
else:
m3 = max(sums3.items())
if not sums4.values():
m4 = (0,0)
else:
m4 = max(sums4.items())
if not sums5.values():
m5 = (0,0)
else:
m5 = max(sums5.items())
if not sums6.values():
m6 = (0,0)
else:
m6 = max(sums6.items())
Пример:
max(sums1.items()) = (132.4, 5.66)
Где 132.4 - это номер максимальной цены, а 5.66 это максимальная цена.
sums1.items() = ([(19151.0, 0.0379), (19150.0, 0.0001), (19148.0, 3.1432000000000007), (19146.0, 0.24550000000000002), (19141.0, 0.0528)])
Ответы (6 шт):
Да простая инверсия условия уже сокращает код в два раза
if sums1.values():
m1 = max(sums1.items())
И не надо никаких else и pass. Если в ветке if стоит только pass, то очевидно, что тут надо наоборот.
Можно сделать генератор
m1,m2,m3,m4,m5,m6 = (max(x.items()) if x.values() else None for x in [sums1, sums2, sums3, sums4, sums5, sums6])
но нужно всегда возвращать какое-то значение, чтобы понимать, в какую переменную что попадет, да и просто, чтобы длины кортежей совпали
если есть старое значение m1, которое должно сохраняться при условии, то
if not sums1.values():
pass
else:
m1 = max(sums1.items())
можно преобразовать в
m1 = max(sums1.items()) if sums1.values() else m1
для остальных записей аналогично
По идее вообще все можно свернуть в такое:
arr = [(m1, sums1), (m2, sums2), (m3, sums3), (m4, sums4), (m5, sums5), (m6, sums6)]
m1, m2, m3, m4, m5, m6 = [max(sums.items()) if sums.values() else m for m, sums in arr]
Нельзя не создавать m-переменные, если sums пуcтые, т.к. потом будет неочевидно, можно ли ее использовать или она не определена, проще все в dict или list сохранить, которые запомнят соответствие m и sums, но если очень хочется делать именно так, то:
for e, s in enumerate((sums1, sums2, sums3, sums4, ), start=1):
if s:
locals()[f'm{e}'] = max(s.values())
print(m2) # 3
--
M = {e: max(s.values() or [0]) for e, s in enumerate([sums1, sums2, sums3, sums4, ], start=1)}
print(M[2]) # 3
locals().update({f'm{e}': m for e, m in M.items()})
print(m2) # 3
вы не указали какой тип данных у sums1, sums2 и т.д., но есть подозрение, что это словари. если это действительно так, то можно обойтись без проверки условий, примерно так:
m1 = max(sums1.items(), default=None)
m2 = max(sums2.items(), default=None)
# и т.д.
def get_max(elem: dict):
# Поскольку словарь не имеющий значений не будет иметь и ключей
# То вполне себе можно ограничиться проверкой самого словаря
if elem:
# поскольку dict.items() это кортеж кортежей
# возникает вопрос, а по каким критериям
# определяется максимальный из кортежей
# возьму на себя смелость предположить,
# что по второму элементу кортежа
return max(elem.items(), key=lambda x: x[1])
# Можно что-то такое замудрить, но по-хорошему нужно разбираться там,
# где вы наделали такую кучу словарей
m1, m2, m3, m4, m5, m6 = map(get_max, [sums1, sums2, sums3, sums4, sums5, sums6])
UPD
В вопросе принципиально ничего, кроме того, что Вы добавили дефолтное значение, не поменялось
sums1 = dict([(19151.0, 0.0379), (19150.0, 0.0001), (19148.0, 3.1432000000000007), (19146.0, 0.24550000000000002), (19141.0, 0.0528)])
sums2 = dict()
sums3 = dict([(29151.0, 2.0379), (29150.0, 4.0001), (29148.0, 2.1432000000000007), (29146.0, 1.24550000000000002), (29141.0, 1.0528)])
d_max = lambda x: max(x.items(), key=lambda x: x[1], default=(0, 0))
print(
d_max(sums1),
d_max(sums2),
d_max(sums3),
sep='\n'
)
# (19148.0, 3.1432000000000007)
# (0, 0)
# (29150.0, 4.0001)