Понимание списка для возврата списка, если значение не существует

Я собираюсь использовать понимание списка для возврата значений в списке. В частности, если '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
list2 = [s for s in list2 if s == 'x'] if 'x' in list2 else list2
John Gordon 16.04.2024 02:33

«В частности, если «x» находится в списке, я хочу удалить все остальные значения. Однако, если «x» нет в списке, я хочу вернуть те же значения (а не возвращать пустой список)». Понимание списка выполняет один проход, по одному элементу за раз. К тому моменту, когда мы узнаем, что 'x' нет в списке, мы уже просмотрели все элементы (чтобы убедиться, что их нет 'x'), поэтому понимание не может вернуться и включить их.

Karl Knechtel 03.05.2024 22:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
70
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это сохранит все элементы, кроме 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

tonydanza123 16.04.2024 02:24

Нет, если в списке более одного x.

OneCricketeer 16.04.2024 02:28

Не то чтобы это имело большое значение, но можно сделать это более эффективно. 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 16.04.2024 02:37

@juanpa.arrivillaga, вы правы, и я думаю, что политические деятели говорят так, но я нахожусь в лагере «я не согласен». В строго типизированном языке это имело бы смысл, но в Python мне это не нравится из-за удобства чтения.

Kraigolas 16.04.2024 03:36

Как насчет:

list1 = [s for s in list1 if s == 'x'] or list1

Если понимание создает пустой список, оператор or воспримет его как False и вернет полный список.

Другие вопросы по теме