2016-08-11 6 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'のリスト値は1つの要素だけですか? – 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 
関連する問題