簡體   English   中英

難以從python字典中獲取項目列表組合的項目計數

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

我有下面的字典輸入列表

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}]};

我試圖獲取每個cid的id的計數以及id值,我使用下面的代碼 -

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)

這使輸出為 -

[{'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]}
 ]

但是我怎樣才能得到類別{66,27,29}的組合?

我嘗試使用以下方法來獲取此輸入的組合 - 它給出了列表中項目的組合

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

但我無法弄清楚如何使用這種方法從'inpdata'獲取類別{66,27,29}的結果如下所示

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

你能告訴我如何實現這個目標嗎?

itertools.combinations(1)itertools.combinations(2) ,... upto itertools.combinations(n)將為你提供fs_cat所有組合(其中,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]}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM