Оператор if без ветки else при создании массива с циклом for - PullRequest
0 голосов
/ 03 января 2019

Я хочу создать встроенный массив следующим образом: [x if arr[arr.index(x)+1] < x for x in arr] но когда я делаю это, python говорит мне, что я не могу этого сделать, не имея ветки else для моего оператора if.

Единственное "решение", которое я нашел, было следующее: list(filter(lambda x: x != None, [x if arr[arr.index(x)+1] < x else None for x in arr]) но это просто уродливо и неоправданно. Причина, по которой я хочу инициализировать массив таким образом, состоит в том, чтобы код был коротким и чистым, но теперь было бы лучше сделать обычный цикл for.

Надеюсь, есть лучшие способы сделать это;)

Ответы [ 2 ]

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

Вы можете перебирать пары из списка:

[a for a, b in zip(arr, arr[1:])
 if a < b]

Например:

>>> arr = [1, 3, 2, 4]
>>> [a for a, b in zip(arr, arr[1:])
...  if a < b]
[1, 2]

Принятый ответ вылетает со следующими значениями:

>>> [x for x in arr if arr[arr.index(x)+1] < x]
Traceback (most recent call last):
IndexError: list index out of range
0 голосов
/ 03 января 2019

Ваш if находится в неправильном положении, чтобы правильно реализовать filter() с пониманием списка.Попробуйте вместо этого:

[x for x in arr if arr[arr.index(x)+1] < x]

Подробнее см. Сравнение списков и лямбда + фильтр .

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