Python 中的 Lisp "some"?

16 投票
3 回答
12819 浏览
提问于 2025-04-15 22:10

我有一个字符串的列表,还有一个过滤器的列表(这些过滤器也是字符串,应该被当作正则表达式来理解)。我想要一个新的列表,里面包含我字符串列表中至少被一个过滤器接受的所有元素。理想情况下,我会这样写

[s for s in strings if some (lambda f: re.match (f, s), filters)]

其中“some”是这样定义的

def some (pred, list):
    for x in list:
        res = pred (x)
        if res:
            return res
    return False

在Python中有没有类似的功能,或者有没有更符合习惯的做法呢?

3 个回答

1

Python中的lambda表达式功能比LISP中的要弱很多。

在Python中,lambda表达式不能包含代码块,所以在lambda中不能使用for循环。

我建议使用闭包,这样你就不需要每次都传递列表。

def makesome(list):
    def some(s)
        for x in list:
            if x.match(s): 
                return True
        return False
    return some

some = makesome(list)

[s for s in strings if some(s)]
7

在编程中,有时候我们会遇到一些问题,尤其是在使用特定的工具或库时。比如,有人可能在使用某个库的时候,发现它的功能和自己想要的不太一样。这种情况下,大家通常会在网上寻找解决方案,比如在StackOverflow上提问。

在提问时,最好能把遇到的问题描述得清楚一些,比如说你在做什么,遇到了什么错误,或者你希望实现什么功能。这样其他人才能更好地理解你的问题,并给出有效的建议。

有时候,问题的解决方案可能涉及到一些代码示例,大家可以通过这些示例更直观地理解问题所在。记得在提问时附上相关的代码,这样能帮助别人更快地找到问题的根源。

总之,提问时清晰明了是非常重要的,这样才能得到更好的帮助。

[s for s in strings if any(re.match (f, s) for f in filters)]
23

有一个叫做 any 的函数,它大致上可以满足你的需求。我觉得你在找的就是这个:

[s for s in strings if any(re.match(f, s) for f in filters)]

撰写回答