我使用python的(2.7)eval()
函数生成条件语句,如下所示:
my_list = ['2 > 1','3 > 2','4 > 3']
if eval('(' + ') or ('.join(my_list) + ')'):
print 'yes'
else:
print 'no'
在我的例子中,列表由代码生成,my_list来自参数文件,列表与条件表达式中的'或'语句连接。上面的代码打印'是'。
它适用于小型列表,但是eval()
语句中的一定数量的字符,我收到字符串错误。
有些搜索发现这些线程指向了一个错误:
但是他们的最大eval()大小比我发现的要大得多。在我的情况下,我发现问题开始在1744和1803之间。我尝试了这个代码,它确实在两个语句之间崩溃了
>>> eval("1.0*"*10000+"1.0")
1.0
>>> eval("1.0*"*100000+"1.0")
# segfault here
所以,这让我回想起它不是eval(),但实际上是if
语句的最大值。
有条件地在列表中应用不涉及长字符串和eval()函数的规则的另一种方法是什么?
有趣的是,我让my_list更大了:
my_list = ['2 > 1']*1000000
并且代码工作正常......
答案 0 :(得分:9)
也许我错过了一些东西,但似乎是:
any(map(eval, my_list))
完全符合您的要求。
from itertools import imap
any(imap(eval, my_list)) # Python 2.
如果第一个元素篡改为True
(也称为"短路"),那么不评估列表的其余部分会产生很好的效果。这可能是也可能不是你想要的。
示例:
> any(map(eval, ['2 > 1','3 > 2','4 > 3']))
True