我敢打赌itertools
为基础的解决方案将会更快,但如果他们需要避免(例如,在没有itertools.product的情况下停留在Python 2.5上),当然必须在“基本Python”中完全编码。
试图“使出浑身解数”的速度,也许是这样的:(!需要与现实的样本数据彻底剖析)
def odo(*names_and_valuelists):
aux = [[vl, 0] for n, vl in names_and_valuelists]
if any(len(vl)==0 for vl, _ in aux):
return
while True:
yield tuple(vl[i] for vl, i in aux)
for vlandi in reversed(aux):
if vlandi[1] == len(vlandi[0])-1:
vlandi[1] = 0
else:
vlandi[1] += 1
break
else:
return
虽然小的调整可能仍然加速它。
这是你使用的例子:
def main():
data = [
('Col1', 'value11 value12 value13'.split()),
('Col2', 'value21 value22'.split()),
('Col3', 'value31 value32 value33'.split()),
]
for tup in odo(data[0], data[1]): print tup
print
for tup in odo(data[1], data[2]): print tup
print
for i, tup in enumerate(odo(*data)):
print tup
if i>5: break
if __name__ == '__main__':
main()
发射结果:
('value11', 'value21')
('value11', 'value22')
('value12', 'value21')
('value12', 'value22')
('value13', 'value21')
('value13', 'value22')
('value21', 'value31')
('value21', 'value32')
('value21', 'value33')
('value22', 'value31')
('value22', 'value32')
('value22', 'value33')
('value11', 'value21', 'value31')
('value11', 'value21', 'value32')
('value11', 'value21', 'value33')
('value11', 'value22', 'value31')
('value11', 'value22', 'value32')
('value11', 'value22', 'value33')
('value12', 'value21', 'value31')
itertools。组合会从单个迭代中得到子序列 - 提问者从两个迭代中寻找可能的对 – mdirolf 2009-06-17 15:45:26