我不确定发生了什么,但我认为每个人都有点偏离目标。我会把它归咎于在解释我要解决的问题时做得不好。无论如何,这是我得到了多少:
items[min(range(len(items)), key = lambda x: items[x][0][0])][0].pop(0)
这让我走了大部分路,但剩下要处理的是处理一个列表已经用尽的情况。一旦解决了这个问题,让它成为一个生成器应该是微不足道的,因为我可以把它放在一个循环中并在其中产生,并且希望不需要太多的工作,这可以适应对生成器执行有效的排序合并。
>>> items[min(range(len(items)), key = lambda x: items[x][0][0])][0].pop(0)
[0, 1]
>>> items[min(range(len(items)), key = lambda x: items[x][0][0])][0].pop(0)
[1, 3]
>>> items[min(range(len(items)), key = lambda x: items[x][0][0])][0].pop(0)
[2, 20]
>>> items[min(range(len(items)), key = lambda x: items[x][0][0])][0].pop(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
IndexError: list index out of range
更新:
将仍然有效的项目的正确子集组装起来min
就是票。
def next_value_in_sections(sections):
while 1:
idxs = []
for i, x in enumerate(sections):
if x[0]:
idxs.append(i)
print idxs
if not idxs:
break
j = min(idxs, key=lambda x: sections[x][0][0])
yield (sections[j][0].pop(0), j)
items = [([[0, 1], [2, 20]], 'zz', ''),
([[1, 3], [5, 29], [50, 500]], 'a', 'b')]
x = next_value_in_sections(items)
for i in x:
print i
执行:
$ python test.py
[0, 1]
([0, 1], 0)
[0, 1]
([1, 3], 1)
[0, 1]
([2, 20], 0)
[1]
([5, 29], 1)
[1]
([50, 500], 1)
[]
我会注意到这仍然可以改进,每次迭代都会重建 idxs 列表。不需要,但这样做并不能改善渐近界......当然,人们不得不怀疑我们是否真的关心性能,使用 lambda 是否也是一个好主意,虽然我真的不在不拆开的情况下找到解决方法min
,这简直是陷入疯狂。