我想达到以下效果
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)
答案 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))。