在字典中对相同的值进行分组并给每个标记(或将它们分配到一个新的字典中)

Group same values in a dictionary and give each a mark (or assign them into a new dict)

假设我有这样一本字典

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'}}

有人有什么想法吗?

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)

这是我的简单有效的解决方案。

#! /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