Как перевести вложенный if-else в понимание списка python - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь преобразовать «обычный» вложенный if-else для понимания списка в python, но я не смог этого сделать.

def functst(a, list_a, b, list_b):
    list_result = []
    for i in range(len(list_a)):
        if a != 0:
            if list_a[i] <= a:
                list_result.insert(i, 1)
            else:
                list_result.insert(i, a/list_a[i] * (1 - list_b[i]))
        elif list_a[i] <= b:
             list_result.insert(i,1)
        else:
            list_result.insert(i, b/list_a[i] * (1-list_b[i]))
    return list_result

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

Ответы [ 3 ]

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

Не знаю, почему вы хотите это сделать, но, возможно,

if a:
  return [1 if list_a[i] <= a else (a / list_a[i] * (1 - list_b[i]))
          for i in range(len(list_a))]
else:
  return [1 if list_a[i] <= b else (b / list_a[i] * (1 - list_b[i]))
          for i in range(len(list_a))]

Вы можете сделать его однострочным с return [<first list>] if a else [<second list>] или возможно единственное понимание с вложенностью:

[(... if ... <= a else ...) if a
 else (... if ... <= b else ...)
 for i in range(...)]

Но на самом деле, зачем это делать?

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

Безобразно, но это делает свою работу:

list_result = [
  (
    1
    if list_a[i] <= a else
    a/list_a[i] * (1 - list_b[i])
  )
  if a != 0 else
  (
    1
    if list_a[i] <= b else
    b/list_a[i] * (1-list_b[i])
  )
  for i in xrange(len(list_a))
]

Лично я против такой сложной логики;хотя ваше решение может показаться непифоническим, его легче понять.

Если вас интересуют подробности, это были мои шаги:

  1. Сделка с внешним if:
list_result = [
  (first condition)
  if a != 0 else
  (second condition)
  (for i in something, or for element in set, or... don't care yet)
]
Сборка первого вложенного if:
list_result = [
  (
    1
    if list_a[i] <= a else
    a/list_a[i] * (1 - list_b[i])
  )
  if a != 0 else
  (second condition)
  (still skipping the iteration part, will return later to it)
]
Создайте второе вложенное if таким же образом. Наконец, создайте итерацию.
0 голосов
/ 06 мая 2019

На каждой итерации вы оцениваете функцию из 2 констант (a, b) и двух переменных (содержимое list_a и list_b).Я бы рекомендовал переместить логику в вспомогательную функцию, которая принимает эти 4 параметра.

def helper(a, A, b, B):
    if a != 0:
        if A <= a:
            return 1
        else:
            return a/A*(1-B)
    elif A <=b:
        return 1
    else:
        return b/A*(1-B)

Теперь вы можете вызывать helper внутри списка, используя zip:

list_result = [helper(a,A_val,b,B_val) for A_val, B_val in zip(list_a, list_b)]

Также в качестве примечания: если вы собираетесь использовать исходную функцию, вы должны использовать append вместо insert.После этого изменения ваш оригинальный метод так же питонен, как и понимание списка.

...