我现在的解决方法是
通过迭代器类生成新的组合内部列表
或者通过iter函数生成新的组合内部列表
有没有其他更好的方法来解决这个挑战?
编辑
@格伦:很反对。
我没有想到这一点,因为我经历了没有按我想的方式排序的列表。
@谢谢你的解决方案。我学了链子
@迈克·德西莫内:嗯,测试了你的解决方案,但出了问题,也许我还错过了什么,。。。
@杰米和奥多蒙托斯:
感谢您指出更详细的
我的目标
我正在伪造一个小算法,它可以转换任务列表-对/元组:(开始,停止)–
一个简单的任务列表,其中重叠的任务合并在一起。
一个例子:当一个事件与另一个事件完全重叠时,我的算法失败(s1 s2 e2 e1)
详细的:
我有一个“任务列表”和两人一组(课程
学习-元组:)。
每元组
由2个datetimeobjects组成:start
任务的结束。
重要事项:
“任务列表”的时间顺序,其中
顺序由start决定,因为
任务可能重叠
“taskList”包含几天,因此是datetime对象
例如,只是时间的字符串表示,以便可读

taskList = [(9:00,10:00),(9:30,11:00),(11:00,12:30),(13:30,14:00),(14:00,18:00)]

最终结果:
result = [(9:00,12:30), (13:30,18:00)]

现在我的想法是,当我以我质疑的方式重新排列“任务清单”时
taskListT1 = [(9:00,),(10:00,9:30),(11:00,11:00),(12:30,13:30),(14:00,14:00),(18:00,)]

现在我可以消除那些元组(a,b),其中a>=b:
taskListT2 = [(9:00,),(12:30,13:30),(18:00,)]

然后转换回来:
result = [(9:00,12:30), (13:30,18:00)]

最佳答案

好吧,这是有收益的解决方案:

# transform forwards
def transform_pairs( lst ):
    it = iter(lst)
    a,last = next(it)
    yield [a]
    for a,b in it:
        yield last, a
        last = b
    yield [last]

将列表转换回原来的样子应该非常相似,但我将留给读者。
这是另一个稍微复杂一点的,可以在两个方向上变换。它产生元组,因为固定长度的列表是不完整的。
from itertools import chain

def transform( iterable, offset):
    it = chain.from_iterable(iterable) # turn it back to one long list.
    if offset:
        yield next(it), # the trailing `,` makes this a tuple.
    for item in it:
        try:
            x = next(it)
        except StopIteration: # there is no 2nd item left
            yield item,
        else:
             yield item, x # yield the pair

print list(transform(transform([[1,2],[3,4],[5,6],[7,8]], True), False))

10-07 19:18
查看更多