2016-08-11 2 views
0

이 만 할 때, 내가 같은 값을 기준으로 그룹을하려는이그룹 같은 사전의 값과

origin_dict={0:[],1:[],2:['bus'],3:['bus'],4:['bus'],5:[],6:[],7:['train'],8:['train'],9:['train'],10:[],11:[],12:['train'],13:['train'],14:[]} 

같은 사전 있다고 가정 각 마크를 제공 (또는 새로운 딕셔너리로를 할당) 그들은 연속적이다.

new_dict={0:{2:'bus',3:'bus',4:'bus'},1:{7:'train',8:'train',9:'train'},2:{12:'train',13:'train'}} 

누구나 아이디어가 있습니까?

+0

'origin_dict '의 목록 값은 단일 요소입니까? – MervS

+2

사전은 순서가 지정되지 않으므로 연속성 요구 사항을 충족 할 수 없습니다. –

+0

예 모두 단일 요소입니다. –

답변

1
from collections import defaultdict 
from operator import itemgetter 
from itertools import groupby 

origin_dict = {0: [], 1: [], 2: ['bus'], 3: ['bus'], 4: ['bus'], 5: [], 6: [], 7: [ 
    'train'], 8: ['train'], 9: ['train'], 10: [], 11: [], 12: ['train'], 13: ['train'], 14: []} 

result = defaultdict(list) 
for k, v in origin_dict.iteritems(): 
    key = "".join(sorted(v)) 
    if key != "": 
     result[key].append(k) 

solution = defaultdict(dict) 
index = 0 
for k, data in result.iteritems(): 
    for k1, g in groupby(enumerate(data), lambda (i, x): i - x): 
     for v2 in map(itemgetter(1), g): 
      solution[index][v2] = k 
     index += 1 

print origin_dict 
print dict(solution) 
+0

안녕하세요, 감사합니다. origin_dict의 값이 'bus'가 아니고 'train'이 아닌 경우 최종 솔루션의 순서가 변경 될 수 있습니다. 문제를 해결하는 방법을 알고 있습니까? –

0

이것은 내 간단하고 효율적인 솔루션입니다.

#! /usr/bin/python 
origin_dict={0:[],1:[],2:['bus'],3:['bus'],4:['bus'],5:[],6:[],7:['train'],8:['train'],9:['train'],10:[],11:[],12:['train'],13:['train'],14:[]} 

dict_out = {} 
int_dict = {} 
mine_keys = [key for key in origin_dict.keys() if not origin_dict[key] == []] 
prev_val = False 
keyind = 0 
for key in origin_dict: 
     if not key in mine_keys: 
       if prev_val == True: 
         dict_out[keyind] = int_dict 
         prev_val = False 
         keyind += 1 
         int_dict = {} 
     else : 
       prev_val = True 
       int_dict[key]=origin_dict[key] 

print origin_dict 
print dict_out