我需要使用以下语法来过滤列表operations
:
a = [ope for ope in operations if ope[0] == 1]
if
语句条件是可变的,可能包含多个条件:
a = [ope for ope in operations if ope[0] == 1 and ope[1] == "test"]
我使用函数来构建条件并将其作为字符串返回:
>>>> c = makeCondition(**{"id": 1, "title": 'test'})
>>>> c
"ope[0] == 1 and ope[1] == 'test'"
有没有办法将c
变量集成到列表过滤中?像这样的东西(当然,c
变量在下面的例子中被评估为一个字符串):
a = [ope for ope in operations if c]
感谢您的帮助!
答案 0 :(得分:2)
eval
被视为unsafe,通常会被避免。
您可以将[filter][1]
与功能结合使用。为此,您应该将测试条件放在一个函数中。
这是一个创建1到100之间的数字列表的示例,它是3和7的倍数
def mult3(n):
return n % 3 == 0
def mult7(n):
return n % 7 == 0
def mult3_and_7(n):
return mult3(n) and mult7(n)
list(filter(mult3_and_7, range(1, 101)))
更简洁的方法是使用lambdas:
list(filter(lambda n: (n % 3 == 0) and (n % 7 == 0), range(1, 101))
很酷的是你可以像这样链接过滤器:
list(filter(lambda n: n % 3 == 0, filter(lambda n: n % 7 == 0, range(1, 101))))
他们都给[21, 42, 63, 84]
这种方法可以帮助您清楚地链接多种情况。
答案 1 :(得分:0)
如评论所述,如果您想要将字符串更改为表达式,则可以使用eval(string)
。