простое удаление элементов из списка в python - PullRequest
1 голос
/ 09 октября 2009

Я бы хотел добиться следующего эффекта

a=[11, -1, -1, -1]
msg=['one','two','tree','four']
msg[where a<0]
['two','tree','four']

Аналогичным простым способом (без неприятных петель).

PS. Для любопытных это утверждение if изначально работает на одном из функциональных языков.

// EDIT

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

filter(lambda x: not x.endswith('one'),msg)

Ответы [ 4 ]

10 голосов
/ 09 октября 2009

Для этого вы можете использовать список пониманий . Вам необходимо сопоставить элементы из двух списков, для которых используется функция zip. Это создаст список кортежей, где каждый кортеж содержит один элемент из каждого из исходных списков (то есть [(11, 'one'), ...]). Получив это, вы можете перебрать результат, проверить, находится ли первый элемент ниже 0, и вернуть второй элемент. См. Связанные документы Python для получения дополнительной информации о синтаксисе.

[y for (x, y) in zip(a, msg) if x < 0]

Похоже, что реальная проблема заключается в поиске элементов в списке msg, которые не содержат строку "one". Это можно сделать напрямую:

[m for m in msg if "one" not in m]
2 голосов
/ 09 октября 2009
[m for m, i in zip(msg, a) if i < 0]
1 голос
/ 09 октября 2009

Ответы, которые уже опубликованы, хороши, но если вам нужна альтернатива, вы можете посмотреть на numpy и его массивы.

>>> import numpy as np
>>> a = np.array([11, -1, -1, -1])
>>> msg = np.array(['one','two','tree','four'])
>>> a < 0
array([False,  True,  True,  True], dtype=bool)

>>> msg[a < 0]
array(['two', 'tree', 'four'], dtype='|S4')

Я не знаю, как индексирование массивов реализовано в numpy, но обычно оно быстро и, вероятно, переписано на C. По сравнению с другими решениями это должно быть более читабельным, но для него требуется numpy.

0 голосов
/ 09 октября 2009

Я думаю [msg [i] для i в диапазоне (len (a)), если a [i] <0] </strong> будет работать для вас.

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