首页 > 解决方案 > 仅当它们是连续的时,Python才根据值对字典中的项目进行分组?

问题描述

我一直在努力根据值对字典中的连续项目进行分组。

假设这是我的数据:

data = {
    12: {
        type: 'image'
    }, 
    13: {
        type: 'image'
    },
    1: {
        type: 'audio'
    },
    2: {
        type: 'image'
    },
    5: {
        type: 'image'
    }
}

我想将相似的项目组合在一起,只有它们是连续出现的,如下所示:

group = {
    12: {
        type: 'image',
        items: [12, 13]
    },
    1: {
        type: 'audio'
    },
    2: {
        type: 'image',
        items: [2, 5]
    }
}

这是我尝试过的:

successive = False
last_key = -1

for key, item in data.items():
    if item['type'] == 'image':
        if not successive:  # use a new key
            last_key = key

        if last_key in group:
            group[last_key]['items'].append(item)
        else:
            group[last_key] = {
                'type': 'image',
                'items': list()
            }

            group[last_key]['items'].append(item)

        successive = True
    else:
        group[key] = item

        successive = False

但它将所有图像分组在一个列表中。我真的很困惑我在逻辑中错过了什么?

标签: pythonlogicgrouping

解决方案


试试这个解决方案。对于只有一个项目的任何组,项目的长度将仅为 1。

from copy import deepcopy
currentType = list(data.values())[0]['type']
currentVal = list(data.keys())[0]
currentItems = [list(data.keys())[0]]
res = {}
for k,v in data.items():
    if k not in res and k == currentVal:
        res[currentVal] = {'type': v['type'], 'items' : deepcopy(currentItems)}
    elif k not in res and v['type'] == currentType:
        res[currentVal]['items'].append(k)
    else:
        currentItems.clear()
        currentVal = k
        currentType = data[k]['type']
        currentItems.append(k)
        res[currentVal] = {'type': currentType, 'items' : deepcopy(currentItems)}

print(res)

推荐阅读