2012-09-17 5 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

수 있습니다 정확히 어떻게 그 ouuput 원하는 이해합니까? 5, 12 번은 어디로 갔니? – Shades88

+1

가능한 중복 [시간 범위가 겹치는 시간 범위 튜플 목록 병합] (http://stackoverflow.com/questions/5679638/merging-a-list-of-time-range-tuples-that-have -overlapping-time-ranges); 허용 된 응답은 예상 출력에 대해 완벽하게 작동합니다. –

답변

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'가 바뀌면 작동하지 않습니다. 첫 번째 항목은'merge'가 제대로 작동하려면 "가장 작은"것이어야합니다. –

+0

@ lazyr : 여분의 정렬은이를 해결합니다. :-) –

+3

+1 무엇이 문제인지 짐작할 수 있습니다. – WolframH