2009-10-09 3 views
1

Я хотел бы, чтобы достичь следующего эффектапростые Отключающие элементы из списка в Python

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

В подобной простой форме (без противных петель).

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

// EDIT

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

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

Я почти достиг этого с помощью карты (lambda x: operator.itemgetter (x) (msg), [1, 2, 3]), но как это сделать: [1,2,3] – bua

+0

Вы можете получить '[1,2,3]' используя '[i for (i, j) в перечислении (a), если j <0]', но решение 'zip' лучше. –

+0

Меня интересует производительность, но я полагаю, что ваше почтовое решение, вероятно, будет быстрее. – bua

ответ

10

Для этого можно использовать list comprehensions. Вам нужно сопоставить элементы из двух списков, для которых используется функция 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] 
+0

Все еще учится, но можете ли вы объяснить этот прекрасный бит кода? –

+0

Я добавил дополнительную информацию и ссылку на руководство. –

+0

@ Лукас. Не могли бы вы также добавить готовое решение, которое я представил, в своем собственном комментарии под моим сообщением? – bua

2
[m for m, i in zip(msg, a) if i < 0] 
+2

Думайте, что у вас есть опечатка, SilentGhost - второй «за» должен быть «в» –

+0

спасибо, Андре, хорошо пойман – SilentGhost

1

ответы уже размещены хорошо, но если вы хотите альтернативу вы можете посмотреть на 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, но это, как правило, быстро и problably переписано в С. По сравнению с другими решениями, это должно быть более удобным для чтения, но это требует NumPy.

0

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

+0

, это просто баааад. – SilentGhost

+0

Pls просветит меня .. Это будет очень полезно – Prabhu

Смежные вопросы