2012-09-17 121 views
-5

两个名单上有两个列表,排序和合并列表

[[1, 2], [4, 7], [11, 13], [15, 21]] 

[[3, 4], [5,12], [23, 25]] 

我想这样的输出。

[[1, 2], [3,13], [15, 21], [23, 25]] 

任何人都可以帮助我吗?

+10

,输出是如何确定的?我看不到这种模式。 “[3,4]”,“[4,7]”和“[11,13]”如何变成“[3,13]”? –

+0

可以;你不知道你想如何输出? 5号和12号去哪了? – Shades88

+1

[合并具有重叠时间范围的时间范围元组列表]的可能重复(http://stackoverflow.com/questions/5679638/merging-a-list-of-time-range-tuples-that-have -overlapping-时间范围);接受的答案完美适用于您的预期输出。 –

回答

5

Merging a list of time-range tuples that have overlapping time-ranges算法完全适用于您的输入,只要你将它们连接起来:

def merge(times): 
    saved = list(times[0]) 
    for st, en in sorted([sorted(t) for t in times]): 
     if st <= saved[1]: 
      saved[1] = max(saved[1], en) 
     else: 
      yield tuple(saved) 
      saved[0] = st 
      saved[1] = en 
    yield tuple(saved) 

lst1 = [[1, 2], [4, 7], [11, 13], [15, 21]] 
lst2 = [[3, 4], [5,12], [23, 25]] 

print list(merge(sorted(lst1 + lst2))) 

输出:

[(1, 2), (3, 13), (15, 21), (23, 25)] 
+0

如果交换“lst1”和“lst2”,则它不起作用 - 第一项必须是“合并”正确工作的“最小”。 –

+0

@lazyr:额外的排序解决了这个问题。 :-) –

+3

+1用于猜测问题是什么。 – WolframH