2012-06-17 19 views
6

Angenommen, ich habe eine Menge myset von benutzerdefinierten Objekten, die gleich sein können, obwohl ihre Referenzen unterschiedlich sind (a == b and a is not b). Jetzt, wenn ich add(a) zum Set, nimmt Python korrekt an, dass a in myset and b in myset, obwohl es nur len(myset) == 1 Objekt im Set gibt.Python: Zugriff auf Mitglieder eines Satzes

Das ist klar. Aber ist es jetzt möglich, den Wert a irgendwie aus dem Set zu extrahieren, nur b? Angenommen, die Objekte sind änderbar und ich möchte sie beide ändern, wobei ich den direkten Verweis auf a vergessen habe. Anders ausgedrückt, suche ich nach der myset[b] Operation, die genau das Mitglied a des Satzes zurückgeben würde.

Es scheint mir, dass der Typ set dies nicht tun kann (schneller als Iterieren durch alle seine Mitglieder). Wenn ja, gibt es zumindest einen effektiven Work-around?

+0

Warum brauchen Sie, dies zu tun? Wenn du schon 'b' hast, warum brauchst du' a', was gleich ist? –

+0

Das ist eine fugly Voraussetzung ... –

+0

@KarlKnechtel: das Element innerhalb der Menge wird von woanders referenziert (von innerhalb einer tiefen Struktur) und ich möchte seinen Wert ändern. Die Objekte sind grundsätzlich vom 2D-Vektortyp und sie sind veränderbar. – emu

Antwort

5

Ich glaube nicht, dass set unterstützt Abruf eines Artikels in O (1) Zeit, aber Sie könnten stattdessen eine dict verwenden.

d = {} 
d[a] = a 
retrieved_a = d[b] 
+0

In der Tat habe ich damit herumgearbeitet und vor einer Weile die Quelle angeschaut, und IIRC, cpython iteriert immer über den kleineren Satz, wenn nach Schnittpunkten gesucht wird. Also, was Sie haben, funktioniert, aber wenn "s" länger ist, wird dies "b" zurückgeben. – senderle

+0

@senderle: Ich denke, du hast Recht - [Quelle für Satz] (http://svn.python.org/projects/python/trunk/Objects/setobject.c).Dann schlägt mein zweiter Ansatz fehl, also lösche ich ihn. Danke, dass du es aufgezeigt hast. –

0

Wenn Sie nur myset und b haben, dann aus dieser Perspektive, werden Sie keinen Zugriff auf a haben, weil es nicht da ist. Wenn Sie mehrere veränderbare Objekte erstellen und eines davon zu myset hinzufügen, sind die anderen nicht "bekannt", wenn Sie nur mit myset oder dem Objekt arbeiten, das Sie hinzugefügt haben.

Wenn Sie a und b ändern möchten, müssen Sie beide Objekte verfolgen.

0

Vielleicht:

(myset - (myset - set([b]))).pop() is a 
+0

Es funktioniert, aber der Satz Unterschied (nämlich die erste) erfordert höchstwahrscheinlich Python alle Elemente nacheinander zu entfernen. Aus diesem Grund ist es asymptotisch genauso langsam wie das Iterieren durch die Menge. – emu

+0

@emu: vielleicht, obwohl ich denke, dass es einige Optimierungen für Randfälle geben könnte. Wie auch immer, ich fürchte, das ist der einzige Weg, nur _sets zu verwenden, ohne auf Diktate oder lineare Suche zurückzugreifen. – georg

Verwandte Themen