python中列表中的简单删除元素

时间:2009-10-09 12:21:07

标签: python filter

我想达到以下效果

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 个答案:

答案 0 :(得分: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]

答案 1 :(得分:2)

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

答案 2 :(得分: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中实现数组索引,但它通常很快并且可以在C中重写。与其他解决方案相比,这应该更具可读性,但它需要numpy。

答案 3 :(得分:0)

如果[i]&lt; 0] 对你有用,我认为 [msg [i] for i in range(len(a))。