Я собираюсь использовать понимание списка для возврата значений в списке. В частности, если 'x'
есть в списке, я хочу удалить все остальные значения. Однако, если 'x'
нет в списке, я хочу вернуть те же значения (а не возвращать пустой список).
list1 = ['d','x','c']
list2 = ['d','b','c']
list1 = [s for s in list1 if s == 'x']
list2 = [s for s in list2 if s == 'x']
List2 вернет []
. Где я хочу, чтобы это было ['d','b','c']
list2 = [s for s in list2 if s == 'x' else list2]
Возврат:
list2 = [s for s in list2 if s == 'x' else list2]
^^^^
SyntaxError: invalid syntax
«В частности, если «x» находится в списке, я хочу удалить все остальные значения. Однако, если «x» нет в списке, я хочу вернуть те же значения (а не возвращать пустой список)». Понимание списка выполняет один проход, по одному элементу за раз. К тому моменту, когда мы узнаем, что 'x'
нет в списке, мы уже просмотрели все элементы (чтобы убедиться, что их нет 'x'
), поэтому понимание не может вернуться и включить их.
Это сохранит все элементы, кроме x
list2 = [x for x in list2 if x != 'x']
Однако, если x есть в списке, он все равно вернет все остальные элементы.
Итак, вам понадобится два прохода, чтобы проверить, существует ли x, поскольку само по себе понимание списка не может вернуть эту информацию.
def filter_x(lst):
if 'x' in lst:
return [x for x in lst if x == 'x']
else:
return lst
Да, ок. Думал, что до этого дойдет, но не был уверен. Действительно, тогда это может быть if 'x' in lst: lst = ['x'] else: lst = lst
Нет, если в списке более одного x.
Не то чтобы это имело большое значение, но можно сделать это более эффективно. if 'x' in lst
пройдет по списку один раз, а затем вам придется перестроить список снова. Вместо этого просто предположите, что x
есть в списке, и создайте свой список x
:
tmp = [x for x in lst if x == 'x']
затем проверьте, есть ли элемент в этом списке. Если да, используйте его, в противном случае установите исходный список:
tmp = tmp if len(tmp) > 0 else lst
Конечно, это зависит от вашего варианта использования/нужна ли вам копия (чтобы вы не могли изменить исходный список). Если вы планировали перезаписать исходный список, измените вторую строку на:
lst = tmp if len(tmp) > 0 else lst
В этом и состоит разница между двойным обходом списка и одним.
if len(tmp) > 0
может быть просто if tmp
@juanpa.arrivillaga, вы правы, и я думаю, что политические деятели говорят так, но я нахожусь в лагере «я не согласен». В строго типизированном языке это имело бы смысл, но в Python мне это не нравится из-за удобства чтения.
Как насчет:
list1 = [s for s in list1 if s == 'x'] or list1
Если понимание создает пустой список, оператор or
воспримет его как False и вернет полный список.
list2 = [s for s in list2 if s == 'x'] if 'x' in list2 else list2