我想过滤一个值列表。根据变量的状态,我想返回过滤器的正或负结果。例如:
def foo(it, my_condition):
return [s for s in it if (s.startswith("q") if my_condition else not s.startswith("q"))]
foo(["The", "quick", "brown", "fox"], my_condition=True)
因此在my_condition=True
上我得到["quick"]
而在my_condition=False
我得到["The", "brown", "fox"]
。
我不喜欢这个部分:(s.startswith("q") if filter else not s.startswith("q"))
。它包含重复的代码,并在一个简洁的列表理解中占用了大量空间。我真正想要的只是在not
之后插入if
,具体取决于filter
变量的状态。
这有更漂亮/更干净的解决方案吗?如果可能的话,我想在这种情况下避免lambda表达式的计算开销。
答案 0 :(得分:6)
只需将startswith
的结果与布尔参数进行比较:
def foo(it, keep_matches):
return [s for s in it if s.startswith("q") == keep_matches]
注意:不要调用你的变量filter
,因为这是一个过滤迭代的内置函数,我改为更明确的名称(不确定它是最好的选择,但它比{{1更好}或flag
)