Группировка значений в комбинации списка и словаря - PullRequest
2 голосов
/ 06 мая 2019

Рассмотрим словарь, в котором ключи являются целыми числами, а значения снова являются словарями, имеющими два ключа следующим образом:

servicesdict = { 0 : {'cost' : 30, 'features' : ['f1']},
    1 : {'cost' : 50, 'features' : ['f1']},
    2 : {'cost' : 70, 'features' : ['f1']},
    3 : {'cost' : 200, 'features' : ['f1']},
    4 : {'cost' : 20, 'features': ['f2']},

    5 : {'cost' : 10, 'features' : ['f3']},
    6 : {'cost' : 20, 'features' : ['f3']},
    7 : {'cost' : 50, 'features' : ['f3']},
    8 : {'cost' : 70, 'features' : ['f3']},
    9 : {'cost' : 20, 'features' : ['f4']},

    10 : {'cost' : 20, 'features': ['f5']},
    11 : {'cost' : 20, 'features': ['f5']},
    12 : {'cost' : 40, 'features': ['f5']},
    }

    t1 = [0,1,2,3,4]
    t2 = [5,6,7,8,9]
    t3 = [10,11,12]
    task = [ t1, t2, t3]

Нам нужно сгруппировать подсписки в task в соответствии со значением словаря features и создать список, в котором каждый подсписок пронумерован последовательным значением.Я написал следующий код для группировки этих значений в соответствии с «функциями», который работает правильно и выдает желаемый результат:

tasknew = []
for t in task:
out = [[g for g in group] for key, group in itertools.groupby(t, key = lambda x:servicesdict[x]['features'])]
tasknew.append(out)


count = 0
newlist = []
for t in tasknew:
    x = dict()
    for c in t:
        x[count] = c
        count = count + 1
    newlist.append(x)

tasknew [[[0, 1, 2, 3], [4]], [[5, 6, 7, 8], [9]], [[10, 11, 12]]]

newlist [{0: [0, 1, 2, 3], 1: [4]}, {2: [5, 6, 7, 8], 3: [9]}, {4: [10, 11, 12]}]

Есть ли способ получить последовательную нумерацию с использованием списка или словаря?

1 Ответ

4 голосов
/ 06 мая 2019

Вот один из способов сделать это, используя словарь и сгруппировать элементы в tasks в соответствии с полем features, используя itertools.groupby:

from itertools import groupby, count
c = count()
newlist = [{next(c):list(v) for k,v in groupby(t, key= 
                             lambda x: servicesdict[x]['features'])} 
                             for t in task ]

print(new_list)

[{1: [0, 1, 2, 3], 2: [4]},
 {3: [5, 6, 7, 8], 4: [9]},
 {5: [10, 11, 12]}]

И аналогично для tasknew:

[[list(v) for k,v in groupby(t, key= 
          lambda x: servicesdict[x]['features'])] for t in task]
# [[[0, 1, 2, 3], [4]], [[5, 6, 7, 8], [9]], [[10, 11, 12]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...