2008-10-27 13 views
7

Google App Engine veri deposunda, anonim kullanıcılar için bağlantılar depolayan bir varlık olduğunu düşünün.Python: GQuery sonuç kümesinde DISTINCT (GQL, GAE)

SELECT DISTINCT user_hash FROM links 

Bunun yerine kullanabilirsiniz: Sen desteklenmez aşağıdaki SQL sorgusu gerçekleştirmek istiyoruz

user = db.GqlQuery("SELECT user_hash FROM links") 

sonucu filtrelemek için en verimli Python nasıl kullanılır, bu yüzden DISTINCT sonuç kümesini döndürür? DISTINCT sonuç kümesi nasıl sayılır?

cevap

3

kümesi bununla başa çıkmak iyi bir yoldur: w

>>> a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com'] 
>>> b = set(a) 
>>> b 
set(['livejournal.com', 'google.com', 'stackoverflow.com']) 
>>> 

Bir öneri/ilk yanıt t r /, kümeler ve dicts hızla eşsiz sonuçları alınırken daha iyi olmasıdır, listelerde üyelik O o karşı (n) (1) diğer türleri için, bu yüzden ek veri depolamak veya söz unique_results listesi oluşturmak, böyle bir şey yapmak daha iyi olabilir gibi bir şey yapmak istiyorsanız:

unique_results = {} 
>>> for item in a: 
    unique_results[item] = '' 


>>> unique_results 
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''} 
+0

Küme nesnesi, farklı yıkanabilir nesnelerin sırasız bir koleksiyonudur. (...) 2.4 sürümünde yeni. http://www.python.org/doc/2.5.2/lib/types-set.html –

+1

Kayıt sayısı nispeten küçükse, ayar tamamdır. Fakat veri mağazasında kayıtların sayısı çok fazlaysa, verimsiz olur! Daha iyi bir strateji, sonucu ekleme/güncelleme zamanında önceden hesaplamak ve saklamak olacaktır. – sudarkoff

1

Bir seçenek bir dizi nesnesine sonuçları koymak olacaktır:

http://www.python.org/doc/2.6/library/sets.html#sets.Set

elde edilen seti sadece içine geçirilen farklı değerler oluşacaktır.

Sadece benzersiz nesneleri içeren yeni bir liste oluşturmanın işe yaramayacağını söyleyebiliriz. Bir şey gibi: for döngü de bir liste anlayışı içine yoğunlaşmış olabilir

unique_results = [] 
for obj in user: 
    if obj not in unique_results: 
     unique_results.append(obj) 

O.

0

Maalesef için Bu soruyu bitirmek istiyorum ama GAE'de böyle nesneleri kıyaslayamıyorum, ben olmalıyım Böyle karşılaştırma için .KEY() e:

Dikkat, bu çok verimsiz:

def unique_result(array): 
    urk={} #unique results with key 
    for c in array: 
     if c.key() not in urwk: 
      urk[str(c.key())]=c 
    return urk.values() 

herkes daha iyi bir çözüm varsa, paylaş.

+0

Datastore'da bunun nasıl yapılacağını soran başka bir soru var ve temel cevabı yapamazsınız: http://stackoverflow.com/questions/1183102/how-to-get-the-distinct-value-of-one -of-my-modelleri-in-google-app-motoru. Nasıl denormalize edeceğine dair bazı belirsiz fikirler önermeye çalıştım ama o zamandan beri sanatın durumu değişti. –

5

tamamlanması için bu soruyu Canlandırıcı:

DISTINCT anahtar kelime release 1.7.4 geçildi.

Güncelleştirilmiş GQL referansını (örneğin Python için) here bulabilirsiniz.

İlgili konular