Несколько условных операторов для понимания списка Python - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть список с элементами, над которыми я хочу выполнить операции с 2 условиями .

Одним условием является умножение функции нормы на -1, если элемент отрицательный или покидаетфункция нормы положительна, если элемент положительный.

Список values выглядит следующим образом:

print(values)

-97476.70633454417
-93170.30642401175
-89901.82679086612
-87187.62533194348
-87269.09594982903
-85513.31676486236
-83545.26529198853
-82411.91255123452
-81620.01849452594

Как вы можете видеть, все они отрицательны (в этом эксперименте).

Код выглядит следующим образом:

norm_BIC = [(-1.0) * float(i)/max(values) for i in values if i < 0 or float(i)/max(values) for i in values if i > 0]

Если я запускаю код до оператора or, он работает:

norm_BIC = [(-1.0) * float(i)/max(values) for i in values if i < 0]

Что означает, что все остальное после этогоне работает, потому что я получаю пустой список для norm_BIC при запуске после or.

Как мне исправить это условие?

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Чтобы достичь "this или that" в понимании списка, вам нужно использовать выражение if.Это позволяет вам добавить предложение else, как и ожидалось -

values = [
    -97476.70633454417,
-93170.30642401175,
-89901.82679086612,
-87187.62533194348,
-87269.09594982903,
-85513.31676486236,
-83545.26529198853,
-82411.91255123452,
-81620.01849452594,

]

norm_BIC = [(-1.0) * float(i)/max(values) if i < 0 else float(i)/max(values) for i in values if i > 0]

Синтаксис здесь не зависит от понимания списка, сравните с этим выражением if -

a = 10 if b < 10 else 20

Запустив значения в вашем примере без этого окончательного значения if, то есть

norm_BIC = [(-1.0) * float(i)/max(values) if i < 0 else float(i)/max(values) for i in values]

, я получу следующий вывод:

[-1.1942744945724522,
 -1.1415129295794078,
 -1.1014678561595233,
 -1.0682137414339221,
 -1.0692119109931586,
 -1.0477002865491576,
 -1.0235879240531134,
 -1.0097022038381638,
 -1.0]

Если вы просто хотите убедиться, что результат ваших расчетов положительный, вы можетеиспользуйте встроенную функцию abs().

norm_BIC = [abs(float(i)/max(values)) for i in values]
0 голосов
/ 20 февраля 2019

Кажется, вы просто отфильтровываете отрицательные значения и превращаете их в положительные.Функция abs принимает абсолютное значение, делая ваши входные значения положительными.

norm_BIC = [ abs(float(i))/max(values) for i in values]

не решит вашу проблему?

0 голосов
/ 20 февраля 2019

Вы должны использовать предложение else:

norm_BIC = [(-1.0) * float(i)/max(values) if i < 0 else float(i)/max(values) for i in values]

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