Я бы написал вашу функцию следующим образом:
def mapper(v):
di={
(300,900): 0,
(1400,2100): 1,
(8700,9100): 2,
(3800,4100): 3,
(6400,7000): 4
}
for (t0,t1),ret in di.items():
if t0<v<t1: return ret
return v
translate1={k:mapper(v) for k,v in translate1.items()}
Это не материально отличается от ответа Патрика Артнера, кроме формы функции mapper
как диктанта кортежей,
Пара других комментариев:
- Форма
di={k:f(v) for k,v in di.items()}
- это , а не , выполняющая обновления на месте di
.Вместо этого, понимание вначале создает новый анонимный дикт, а затем назначает его в качестве имени di
по завершении.Основная проблема (возможно) заключается в том, что требования к памяти для этого по крайней мере в 2 раза больше, чем при назначении места. - Единственная форма обновления «на месте» с пониманием:
- Использование назначения среза
li[:]=[list comprehension]
или - Использование
.update
с расширенным пониманиемdi.update({dict comprehension on a subset of di})
- Нет преимуществ в использовании понимания списков по сравнению с пониманием диктов для создания диктов.
- У Dict есть только «порядок» на Python3.6 +.Они используют порядок вставки в этом случае.