Difficulty getting the item count for the combinations of list of items from python dictionary

匿名 (未验证) 提交于 2019-12-03 01:20:02

问题:

I have below input list of dictionaries

inpdata =   {"cat": [{"categories": [{"cid": 27}, {"cid": 66}, {"cid": 29}], "id": 20},                       {"categories": [{"cid": 66}], "id": 21},                       {"categories": [{"cid": 66}, {"cid": 27}], "id": 22},                       {"categories": [{"cid": 66}, {"cid": 27}], "id": 23},                       {"categories": [{"cid": 66}, {"cid": 29}, {"cid": 27}], "id": 24}]};

Am trying to get the count of id's for each cid along with the id values, I used below code for that -

allcategories = set( sec['cid'] for record in inpdata['cat'] for sec in record['categories'] ) summarize = lambda record: record['id']    fs_cat = [         {             'cat':cid,             'count':len(matches),             'ids':[ summarize( match ) for match in matches ]         }         for cid in allcategories         for matches in [[             record for record in inpdata['cat'] if cid in [ sec['cid'] for sec in record['categories'] ]         ]]     ] print(fs_cat)

This gives the output as -

[{'cat': 66, 'count': 5, 'ids': [20, 21, 22, 23, 24]},  {'cat': 27, 'count': 4, 'ids': [20, 22, 23, 24]},  {'cat': 29, 'count': 2, 'ids': [20, 24]}  ]

But how can I get the combination of the categories {66,27,29} ?

I tried using below approach for getting the combinations of this input - it gives the combination of items from the list

allcategories = {66,27,29} for subset in itertools.chain.from_iterable(itertools.combinations(allcategories, n) for n in range(len(allcategories) + 1)):     print(subset)

But I couldn't figure out how can I use this approach to get me the result as below for categories {66,27,29} from the 'inpdata'

result=[{'cat': '66', 'count': 5, 'ids': [20, 21, 22, 23, 24]},         {'cat': '27', 'count': 4, 'ids': [20, 22, 23, 24]},         {'cat': '29', 'count': 2, 'ids': [20, 24]},         {'cat': '66&27', 'count': 4, 'ids': [20, 22, 23, 24]},         {'cat': '66&29', 'count': 2, 'ids': [20, 24]},         {'cat': '27&29', 'count': 2, 'ids': [20, 24]},         {'cat': '66&27&29', 'count': 2, 'ids': [20, 24]}         ]

Could you please suggest on how I can achieve this?

回答1:

itertools.combinations(1), itertools.combinations(2), ... upto itertools.combinations(n) will give you all combinations of fs_cat (where, n = len(fs_cat))

import itertools import operator from functools import reduce  fs_cat = [     {'cat': 66, 'count': 5, 'ids': [20, 21, 22, 23, 24]},     {'cat': 27, 'count': 4, 'ids': [20, 22, 23, 24]},     {'cat': 29, 'count': 2, 'ids': [20, 24]}, ]  result = [] for n in range(1, len(fs_cat) + 1):  # 1, 2, ..., len(fs_cat)     for xs in itertools.combinations(fs_cat, n):         cat = '&'.join(map(str, sorted(x['cat'] for x in xs)))         ids = sorted(reduce(operator.and_, (set(x['ids']) for x in xs)))         result.append({'cat': cat, 'count': len(ids), 'ids': ids})

>>> result [{'cat': '66', 'count': 5, 'ids': [20, 21, 22, 23, 24]},  {'cat': '27', 'count': 4, 'ids': [20, 22, 23, 24]},  {'cat': '29', 'count': 2, 'ids': [20, 24]},  {'cat': '27&66', 'count': 4, 'ids': [20, 22, 23, 24]},  {'cat': '29&66', 'count': 2, 'ids': [20, 24]},  {'cat': '27&29', 'count': 2, 'ids': [20, 24]},  {'cat': '27&29&66', 'count': 2, 'ids': [20, 24]}]


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!