Использование функции карты с внешним словарем (глобальный) - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь улучшить время вычислений моего кода, поэтому я хочу заменить циклы на функции карты.

Для каждого ключа в словаре я проверяю, больше ли оно определенного значения, и вставляяэто в новый словарь под тем же ключом:

Мой оригинальный код:

dict1={'a':-1,'b':0,'c':1,'d':2,'e':3}
dict_filt = {}
for key in dict1.keys():
   if dict1[key]>1:
        dict_filt[key] = dict1[key]*10

print (dict_filt)

вывод: {'d': 20, 'e': 30}, и это работает, нокогда я пытаюсь с картой:

dict1={'a':-1,'b':0,'c':1,'d':2,'e':3}
dict_filt = {}
def for_filter (key):
    if dict1[key]>1:
        dict_filt[key] = dict1[key]*10

map (for_filter ,dict1.keys())

print (dict_filt)

я получаю пустой словарь

Я пытался заставить его работать с лямбда-выражением:

map (lambda x: for_filter(x) ,dict1.keys())

или определить словари как глобальныено он по-прежнему не работает.

Я буду рад получить помощь

Мне не нужен оригинальный словарь, поэтому, если проще работать с одним словарем, все равно в порядке

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Используйте словарь-понимание вместо map:

{k: v * 10 for k, v in dict1.items() if v > 1}

Код :

dict1 = {'a':-1,'b':0,'c':1,'d':2,'e':3}

print({k: v * 10 for k, v in dict1.items() if v > 1})
# {'d': 20, 'e': 30}
0 голосов
/ 04 мая 2019

map ленив: если вы не потребляете значения, функция for_filter не применяется.Поскольку вы используете побочный эффект для заполнения dict_filt, ничего не произойдет, если вы не форсируете оценку map:

Замените:

map(for_filter, dict1.keys())

На:

list(map(for_filter, dict1)) # you don't need keys here

И вы получите ожидаемый результат.

Но учтите, что это неправильное использование map.Вы должны использовать диктовку понимания (см. Ответ @ Остина).

РЕДАКТИРОВАТЬ: Подробнее о map и лени.в документ : map (function, iterable, ...) Возвращает итератор, который применяет функцию к каждому элементу итерируемого, получая результаты. Объяснение Рассмотрим следующую функцию: >>> def f(x): ... print("x =", x) ... return x ... Эта функция возвращает свой параметр , а выполняет побочный эффект (распечатайтезначение).Давайте попробуем применить эту функцию к простому диапазону с помощью функции map: >>> m = map(f, range(5)) Ничего не печатается!Давайте посмотрим на значение m: >>> m <map object at 0x7f91d35cccc0> Мы ожидали [0, 1, 2, 3, 4], но получили странное <map object at 0x7f91d35cccc0>.Это лень: map на самом деле не применяет функцию, но создает итератор .Этот итератор возвращает при каждом вызове next значение: >>> next(m) x = 0 0 Это значение является результатом применения функции f к следующему элементу сопоставляемой итерации (range),Здесь 0 - это возвращаемое значение, а x = 0 - результат побочного эффекта print. Здесь важно то, что это значение не существует до того, как вы извлечете его из итератора. Следовательно, побочный эффект не выполняется до того, как вы извлечете значение из итератора. Еслимы продолжаем вызывать следующий, мы исчерпаем итератор: ... >>> next(m) x = 4 4 >>> next(m) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration Другой способ получить все значения итератора - создать list. Это не приведение , а скорее создание нового объекта и потребление старого: >>> m = map(f, range(5)) >>> list(m) x = 0 x = 1 x = 2 x = 3 x = 4 [0, 1, 2, 3, 4] Мы видим, что побочный эффект print выполняется для каждого элементадиапазона, и , затем возвращается список [0, 1, 2, 3, 4]. В вашем случае функция ничего не печатает, а присваивает внешнюю переменную dict_filt.Функция не применяется, если вы не используете итератор map. Я повторяю: не используйте map (или какое-либо понимание списка / диктов) для выполнения побочного эффекта (map происходит из функционального мира, где побочный эффект не существует).

...