Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2011 00:47:24

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление повторов во вложенном словаре

У меня появилась похожая задача, только посложнее. Нужно снова удалить повторы из многоуровневого словаря. Вот пример (это относится к задаче классификации, наборы гипотез для ДСМ-метода, нужно убрать конфликтующие гипотезы). Есть вот такой непростой словарь:

hypos = {
'class1':
{
('object1', 'object2'): ['prop1', 'prop2'],
('object1', 'object3'): ['prop2', 'prop3', 'prop5'] # вот этот набор параметров
},
'class2':
{
('object4', 'object5', 'object6'): ['prop5', 'prop3', 'prop1'],
('object4', 'object5'): ['prop2', 'prop3', 'prop5'] # совпадает вот с этим набором, их оба надо удалить
}
}
Нужно удалить элементы во вложенных словарях, у которых совпадают списки параметров, чтобы получилось вот так:
hypos = {
'class1':
{
('object1', 'object2'): ['prop1', 'prop2'],
},
'class2':
{
('object4', 'object5', 'object6'): ['prop5', 'prop3', 'prop1'],
}
}
классов, объектов и параметров может быть любое количество



Отредактировано (Март 9, 2011 00:50:42)

Офлайн

#2 Март 9, 2011 05:59:40

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Удаление повторов во вложенном словаре

ничего изящного у меня не получилось :( два прохода:

from collections import defaultdict

def rm_repeated(dt):
params_dt = defaultdict(list)
for cls, data in dt.iteritems():
for objs, params in data.iteritems():
params_dt[tuple(params)].append((cls, objs))
for ls in params_dt.itervalues():
if len(ls) > 1:
for cls, objs in ls:
del dt[cls][objs]
return dt
А есть что почитать про ДСМ-метод?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Март 9, 2011 09:38:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Удаление повторов во вложенном словаре

pasaranax
Есть вот такой непростой словарь:
переводим в простой набор данных, сортируем, удаляем повторы, восстанавливаем
'class1', ('object1', 'object2'), ('prop1', 'prop2')
'class1', ('object1', 'object3'), ('prop2', 'prop3', 'prop5') # вот этот набор параметров
'class2', ('object4', 'object5', 'object6'), ('prop5', 'prop3', 'prop1')
'class2', ('object4', 'object5'), ('prop2', 'prop3', 'prop5') # совпадает вот с этим набором, их оба надо удалить

'class1', ('object1', 'object2'), ('prop1', 'prop2')
'class1', ('object1', 'object3'), ('prop2', 'prop3', 'prop5') # вот этот набор параметров
'class2', ('object4', 'object5'), ('prop2', 'prop3', 'prop5') # совпадает вот с этим набором, их оба надо удалить
'class2', ('object4', 'object5', 'object6'), ('prop5', 'prop3', 'prop1')

'class1', ('object1', 'object2'), ('prop1', 'prop2')
'class2', ('object4', 'object5', 'object6'), ('prop5', 'prop3', 'prop1')



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version