Python Группировать элементы в словаре на основе значения, только если они идут подряд? - PullRequest
0 голосов
/ 11 июля 2020

Я бился головой, чтобы сгруппировать последовательные элементы в словаре на основе значения.

Предположим, это мои данные:

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

Но он группирует все изображения в один список. Я очень запутался, где я пропустил в своем логе c?

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Попробуйте это решение. Для любых групп с одним элементом длина элементов будет равна 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)
0 голосов
/ 11 июля 2020

Попробуйте это (мой ОКР заставил меня изменить ключи словаря на строки)

def format(data):
    last_type = None
    last_key = -1
    formatted = {}

    for key, item in data.items():
        if item[type] != last_type:
            formatted[key] = {'type': 'image', 'items': [key]}
            last_key = key
            last_type = item[type]
        else:
            formatted[last_key]['items'].append(key)
            last_key = key
            last_type = item[type]
    return formatted
...