2012-06-17 12 views
6

Erişim üyeleri onların referansları (a == b and a is not b) farklı olmasına rağmen eşit olabilecek özel nesneleri kümesi myset olduğunu varsayalım. Ben add(a) sete Şimdi, eğer Python doğru a in myset and b in myset rağmen sette sadece len(myset) == 1 nesne olduğunu varsayar. açıktırPython: bir dizi

. Fakat şimdi a değerini sadece setten b kullanarak çıkarmak mümkün mü? Nesnelerin değişebilir olduğunu ve her ikisini de değiştirmek istediğimi, a'a doğrudan referansı unuttuğumuzu varsayalım. Başka bir deyişle, kümenin tam olarak a üyesine dönecek olan myset[b] işlemini arıyorum.

O (bütün üyeleri yineleme daha hızlı) tip set bunu yapamaz geliyor bana. Eğer öyleyse, en azından etkili bir çalışma var mı?

+0

Bunu neden gerekiyor? Eğer zaten 'b' varsa, neden a'ya ihtiyacınız var? bir fugly gerekliliktir –

+0

... –

+0

@KarlKnechtel: grubunun içindeki eleman (derin yapının içinden), başka bir yerden başvuruda bulunulan ve ben onun değerini değiştirmek istiyorum. Nesneler temel olarak 2D vektör tipindedir ve bunlar değiştirilebilir. – emu

cevap

5

set öğesinin O (1) saat içinde bir öğeyi almayı desteklemediğini sanmıyorum, ancak bunun yerine bir dict kullanabilirsiniz. Yalnızca myset ve b varsa orada değil çünkü

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

Aslında bununla bir takım işler yaptım ve bir süre önce kaynağa baktım ve IIRC, cpython kesişmeleri ararken daima daha küçük setin üzerine çıktı. Öyleyse, ne işiniz var, ama eğer daha uzunsa, bu 'b' yi döndürecektir. – senderle

+0

@senderle: Haklı olduğunuzu düşünüyorum - [set için kaynak] (http://svn.python.org/projects/python/trunk/Objects/setobject.c).Sonra ikinci yaklaşımım başarısız oluyor, ben de siliyorum. İşaret ettiğin için teşekkürler. –

0

, o bakış açısıyla, sen a erişimi olmayacaktır. Birden çok değiştirilebilen nesne oluşturup bunlardan birini myset'a eklerseniz, diğerleri yalnızca myset ile veya eklediğiniz nesneyle uğraşırken 'bilinir' değil.

a ve b'u değiştirmek isterseniz, her iki nesneyi de bir yerde tutmanız gerekir.

0

Belki bu:

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

Çalışıyor, ancak set farkı (yani birincisi) büyük olasılıkla Python'un tüm öğeleri tek tek kaldırmasını gerektiriyor. Bundan dolayı, asimptotik olarak set boyunca yinelenen yavaştır. – emu

+0

@emu: Belki de, kenar kasalar için bazı optimizasyonlar olabileceğini tahmin etsem de. Her neyse, korkarım ki bu dize veya lineer aramaya başvurmadan, _only_ setlerini kullanmanın tek yoludur. – georg

İlgili konular