Понимание списка против словарного понимания - PullRequest
0 голосов
/ 27 ноября 2018

Добрый вечер, люди,

У меня есть следующий код, который изменяет значения словаря «на месте»

translate1 = {k:(0 if v > 300 and v < 900 else v) for k, v in translate1.items()}
translate1 = {k:(1 if v > 1400 and v < 2100 else v) for k, v in translate1.items()}
translate1 = {k:(2 if v > 8700 and v < 9100 else v) for k, v in translate1.items()}
translate1 = {k:(3 if v > 3800 and v < 4100 else v) for k, v in translate1.items()}
translate1 = {k:(4 if v > 6400 and v < 7000 else v) for k, v in translate1.items()}

Мой вопрос заключается в том, можно ли достичь аналогичной цели с помощью понимания списка?Я хочу, чтобы все значения были в порядке в одном и том же списке.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Я бы написал вашу функцию следующим образом:

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 как диктанта кортежей,

Пара других комментариев:

  1. Форма di={k:f(v) for k,v in di.items()} - это , а не , выполняющая обновления на месте di.Вместо этого, понимание вначале создает новый анонимный дикт, а затем назначает его в качестве имени di по завершении.Основная проблема (возможно) заключается в том, что требования к памяти для этого по крайней мере в 2 раза больше, чем при назначении места.
  2. Единственная форма обновления «на месте» с пониманием:
    1. Использование назначения среза li[:]=[list comprehension] или
    2. Использование .update с расширенным пониманиемdi.update({dict comprehension on a subset of di})
  3. Нет преимуществ в использовании понимания списков по сравнению с пониманием диктов для создания диктов.
  4. У Dict есть только «порядок» на Python3.6 +.Они используют порядок вставки в этом случае.
0 голосов
/ 27 ноября 2018

Список компоновок не является панацеей, вам нужен поиск, чтобы сократить итерацию всех элементов () в 5 раз до 1 раза:

def mapper(v):
    if 300 < v < 900:   # syntactical equivalent to v > 300 and v < 900
        return 0
    if 1400 < v < 2100:
        return 1
    if 8700 < v < 9100:
        return 2
    if 3800 < v < 4100:
        return 3
    if 6400 < v < 7000:
        return 4
    return v


translate1 = {k:mapper(v) for k, v in translate1.items()} 

Вам не хватает некоторых значений - я надеюсь, что это намеренно.

...