2014-02-05 3 views
0

하위 목록을 자체 하위 목록으로 채 웁니다. 하위 하위 목록에 인덱스 1에서 공통된 값을 공유하는 경우 하나의 하위 하위 목록을 만들기 위해 하위 하위 목록의 항목을 병합/결합하여 두 개의 하위 목록을 하나로 결합하고 싶습니다. 하위 하위 목록은 인덱스 1에서 AAA를 공유하는 경우공통 값을 공유하는 경우에만 하위 하위 목록을 결합하는 방법은 무엇입니까?

l = [[ 
     ['Sublist1','AAA','10','Apple,Pear,Banana'], 
     ['Sublist1','AAA','50','Peach,Orange,Banana'], 
     ['Sublist1','DDD','3','Bike,Street'] 
    ],[ 
     ['Sublist2','CCC','50','Tomator,Lemmon'], 
     ['Sublist2','EEE','30','Phone,Sign'], 
     ['Sublist2','CCC','90','Strawberry'], 
     ['Sublist2','FFF','30','Phone,Sign'] 
    ],[ 
     ['Sublist3','BBB','100','Tomator,Lemmon'], 
     ['Sublist3','BBB','100','Pear'], 
     ['Sublist3','FFF','90','Strawberry'], 
     ['Sublist3','FFF','50',''] 
    ]] 

예를 들어, 사과, 배,이 케이스 (10)에 인덱스 2와 3에서 항목을 결합 (50)는 '10, 50이 될 것 '을, 그리고' , 바나나 ','피치, 오렌지, 바나나 '는'사과, 배, 바나나, 피치, 오렌지, 바나나 '가 될 것입니다.

Desired_Result = [[ 
     ['Sublist1','AAA','10,50','Apple,Pear,Banana,Peach,Orange'], 
     ['Sublist1','DDD','3','Bike,Street'] 
    ],[ 
     ['Sublist2','CCC','50,90','Tomator,Lemmon,Strawberry'], 
     ['Sublist2','EEE','30','Phone,Sign'], 
     ['Sublist2','FFF','30','Phone,Sign'] 
    ],[ 
     ['Sublist3','BBB','100,100','Tomator,Lemmon,Pear'], 
     ['Sublist3','FFF','90,50','Strawberry'] 
    ]] 
+1

이 특정 사항에 대해서는 실제로 "올바른"대답이 없습니다. 이것을 구현할 수있는 많은 방법이 있습니다. 드로잉 보드에 가서 몇 가지 알고리즘을 제안하고, 가장 좋은 코드를 선택하여 피드백을 위해 CodeReview에 게시하십시오. – samrap

+0

동일한 인덱스에 있어야합니까? 하위 목록을 ['set's] (http://docs.python.org/2/library/sets.html)로 만들고 '.intersection()'을 사용하여 공통점을 볼 수 있습니다. 그러나 세트는 주문을 제거합니다. – 2rs2ts

+0

'[ 'FFF', '30', 'Phone, Sign']'누락 된''Sublist2'는 의도적입니까? –

답변

0

시도해 볼 수 있습니까?

l'FFF' 앞에 'Sublist2'이 있다고 가정했습니다.

def merge(lst): 
    def j(sq): 
     return ",".join(sq) 
    def m(sl): 
     dic = {} 
     for ssl in sl: 
      k = tuple(ssl[0:2]) 
      try: 
       v = dic[k] 
      except KeyError: 
       dic[k] = v = (set(), set()) 
      v[0].update(set(ssl[2].split(','))) 
      v[0].discard('') 
      v[1].update(set(ssl[3].split(','))) 
      v[1].discard('') 
     return [ list(k) + [j(v[0])] + [j(v[1])] for k, v in sorted(dic.iteritems()) ] 
    return [ m(sl) for sl in lst ] 

for sl in merge(l): 
    print sl