Понимание Dict с помощью лямбда-функции и скаляра - PullRequest
0 голосов
/ 22 января 2019

У меня есть dict понимание с лямбда-функцией и скаляром:

d = {k: lambda x : x.sum() if 'a' in k else 'yes' for k in ['bac','sss','asa']}
print (d)
{'bac': <function <dictcomp>.<lambda> at 0x00000000031891E0>, 
 'sss': <function <dictcomp>.<lambda> at 0x000000000D887EA0>, 
 'asa': <function <dictcomp>.<lambda> at 0x000000000D887B70>}

Если хотите, чтобы оба скаляра работали хорошо:

d = {k: 'no' if 'a' in k else 'yes' for k in ['bac','sss','asa']}
print (d)
{'bac': 'no', 'sss': 'yes', 'asa': 'no'}

Ожидаемый результат - комбинация скаляров и лямбда-функции:

print (d)
{'bac': <function <dictcomp>.<lambda> at 0x00000000031891E0>, 
 'sss': 'yes', 
 'asa': <function <dictcomp>.<lambda> at 0x000000000D887B70>}

Что происходит?Почему это не работает?Каков правильный подход?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Ваш синтаксис анализируется следующим образом (обратите внимание на расположение скобок):

{k: lambda x : (x.sum() if 'a' in k else 'yes') for k in ['bac','sss','asa']}
#              ^                              ^

Вы хотите:

{k: (lambda x : x.sum()) if 'a' in k else 'yes' for k in ['bac','sss','asa']}
#   ^                  ^

Это потому, что lambda имеет более низкий приоритет , чем if - else.

Более простой пример также иллюстрирует это:

>>> lambda x: 0 if False else True
<function <lambda> at 0x7efdbe55abf8>
>>> lambda x: (0 if False else True)
<function <lambda> at 0x7efdbe55ac80>
>>> (lambda x: 0) if False else True
True
0 голосов
/ 22 января 2019
d = {k: (lambda x : x.sum()) if 'a' in k else 'yes' for k in ['bac','sss','asa']}

должно работать. Причина (насколько я понимаю) состоит в том, что границы для разбора лямбды перекрываются с вашим пониманием - в основном, python анализирует вашу лямбду как x.sum() if 'a' in k else 'yes' - со ссылкой на локальных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...