示例代码:
e = [[1,2,3,4],[0,...,10000],[4,5,6,7]]
for n in range(0,1000000):
if n in e[0] and n in e[1] and n in e[2]:
yield n
如果我能在e [1] ==范围之前找到,我正在尝试优化速度以避免每次迭代的e [1]查找。 e [0] == range或e [2] == range
也是如此让我更多地澄清一下..我试图在python中编写crontab http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5解析器。
crontab的格式为* * * * *
其中第一个字段是分钟范围(0,60),第二个小时范围(0,23),第三个月范围(1,32),第4个月范围(1,13),第5个星期范围( 0,8)
当每个字段匹配时会发生某些事情, 即每天上午5点30分的格式是
30 5 * * *
现在最简单的解决方案是以60秒的增量迭代下限上限,因为最小增量为1分钟。并使用列表中包含单个数字的全范围匹配字段替换*。
最简单的算法是
for ts in range(startts,endts,60):
now = time.localtime(ts)
if now.tm_min in [5,] and now.tm_hour in [30,] and now.tm_mon in range(0,13) ... etc:
yield now
因为其中一些字段有时*不需要列表查找,并且我试图找出基于'*'动态生成条件的方法
答案 0 :(得分:4)
您希望找到所有三个列表共有的所有元素。这与查找列表所代表的集合的交集基本相同。在Python中,我们可以简单地使用set
并找到交集。
#! /usr/bin/env python
def get_values(lst):
sets=map(set,lst)
common=reduce(lambda x,y:x.intersection(y),sets,set(lst[0]))
for value in common:
yield value
if __name__=='__main__':
e = [[1,2,3,4],range(10000),[4,5,6,7]]
for common_item in get_values(e):
print common_item
答案 1 :(得分:0)
if n==4:
会做到的。至少在你的例子中。
也许您应该告诉我们您的确想要做什么?范围是否始终连续?您正在使用的约束究竟是什么?
答案 2 :(得分:0)
我认为这应该有效:
e = [[1,2,3,4],[0,...,10000],[4,5,6,7]]
for n in e[0]:
if and n in e[2] and n in e[1]:
yield n
它只会检查e [0]中存在的值。如果每个子列表中的元素数量不同,您可以添加一个进一步的通用优化,按照列表大小的顺序检查它们,这样您首先检查最小的列表(在这种情况下我手动完成,但是你得到这个想法。