2013-05-28 2 views
2

По существу, это то, что я пытаюсь сделать:Получение конкретного набора элементов в Python

У меня есть набор, который я добавить объекты. Эти объекты имеют свой собственный метод равенства, и в наборе никогда не должно быть элемента, равного другому элементу в наборе. Однако при попытке вставить элемент, если он равен другому элементу, я хотел бы записать объединенную версию этих двух элементов. То есть, объекты имеют поле «aux», которое не рассматривается в его методе равенства. Когда я закончил добавлять вещи, я хотел бы, чтобы поле «aux» элемента содержало комбинацию всех полей «aux» равных элементов, которые я пытался добавить.

Мое мышление было, хорошо, перед добавлением элемента в набор, проверьте, уже ли он в наборе. Если это так, вытащите его из набора, объедините два элемента, а затем верните их. Однако метод удаления в наборах Python ничего не возвращает, а метод pop возвращает произвольный элемент.

Может ли я делать то, что я пытаюсь сделать с наборами в Python, или я ложное дерево (что является права дерева?)

ответ

2

Похоже, вы хотите defaultdict

from collections import defaultdict 
D = defaultdict(list) 
D[somekey].append(auxfield) 

Edit: Чтобы использовать функцию слияния, вы можете объединить код люди, приведенные в комментариях

D = {} 
for something in yourthings: 
    if something.key in D: 
     D[something.key] = something.auxfield 
    else: 
     D[something.key] = merge(D[something.key], something.auxfield) 
+0

Что бы быть значением (по умолчанию или нет)? Оставляя в стороне, что 'set' может не предлагать необходимую функциональность, отображение кажется концептуально неправильным. – delnan

+0

+1 это работает, потому что он дает уникальность ключам как набор, но с произвольно длинными атрибутами, такими как Мала. Я не вижу концептуального дефекта ', если ключ в D тогда: if not aux in D [key]: D [key] .append [aux]' – msw

+0

спасибо! Несколько вопросов: (1) будет ли это иметь подобный объем памяти для использования наборов? Я работаю в условиях низкой памяти (2), что я буду использовать как «somekey»? хэш? (3) будет ли это работать, если мое слияние является функцией? добавление значений несколько упрощало его, но у меня есть функция слияния (объект, объект). – Mala

Смежные вопросы