2008-10-27 8 views
7

कल्पना कीजिए कि आपको Google App Engine डेटास्टोर में एक इकाई मिली है, जो अज्ञात उपयोगकर्ताओं के लिए लिंक संग्रहीत कर रही है।पायथन: GQuery परिणाम सेट पर DISTINCT (GQL, GAE)

SELECT DISTINCT user_hash FROM links 

इसके बजाय आप इस्तेमाल कर सकते हैं: आप निम्न SQL क्वेरी, जो समर्थित नहीं है निष्पादित करना चाहते हैं

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

परिणाम फिल्टर करने के लिए अजगर सबसे अधिक कुशलता से का उपयोग कैसे करें, तो यह एक DISTINCT परिणाम सेट देता है? DISTINCT परिणाम सेट को कैसे गिनें?

उत्तर

3

एक सेट है कि के साथ सौदा करने का अच्छा तरीका है:

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

एक सुझाव यह w/पहले उत्तर टी आर/यह है कि सेट और dicts जल्दी से अद्वितीय परिणामों को प्राप्त करने में बेहतर हैं, सूचियों में सदस्यता हे है (एन) हे बनाम (1) अन्य प्रकार के लिए है, तो आप अतिरिक्त डेटा स्टोर, या की तरह उल्लेख किया unique_results सूची बनाते हैं, ऐसा लगता है कि कुछ करने के लिए बेहतर हो सकता है कुछ करने के लिए चाहते हैं:

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


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

एक सेट ऑब्जेक्ट विशिष्ट हैशबल ऑब्जेक्ट्स का एक अनियंत्रित संग्रह है। (...) संस्करण 2.4 में नया। http://www.python.org/doc/2.5.2/lib/types-set.html –

+1

सेट ठीक है अगर रिकॉर्ड्स की संख्या अपेक्षाकृत छोटी है। लेकिन अगर आपके पास डेटास्टोर में रिकॉर्ड के गैजिलियन हैं, तो यह काफी अक्षम होगा! सम्मिलित/अपडेट समय पर परिणामों की पूर्व-गणना और स्टोर करने के लिए एक बेहतर रणनीति होगी। – sudarkoff

1

एक विकल्प एक सेट वस्तु में परिणाम डाल करने के लिए होगा:

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

जिसके परिणामस्वरूप सेट केवल यह में पारित कर दिया विशिष्ट मान शामिल होंगे।

विफल होने के कारण, केवल एक अद्वितीय सूची वाली एक नई सूची का निर्माण करना काम करेगा। कुछ की तरह: for पाश के साथ-साथ एक सूची समझ में संघनित किया जा सकता है

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

है।

0

क्षमा करने के लिए इस सवाल को खोदें लेकिन जीएई में मैं इस तरह की वस्तुओं की तुलना नहीं कर सकता, मुझे चाहिए ई .key() इस तरह की तुलना के लिए:

खबरदार, यह बहुत अक्षम है:

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() 

किसी को भी एक बेहतर समाधान है, तो साझा करें।

+0

डेटास्टोर में ऐसा करने का एक और सवाल है, और मूल उत्तर यह है कि आप यह नहीं कर सकते: http://stackoverflow.com/questions/1183102/how-to-get-the-distinct-value-of-one -of-मेरी-मॉडल-इन-गूगल एप्लिकेशन के इंजन। मैंने कुछ अस्पष्ट विचारों का सुझाव देने की कोशिश की कि कैसे denormalize, लेकिन यह संभव है कि कला की स्थिति तब से चली गई है। –

5

पूरा करने के लिए इस सवाल का फिर से जीवित:

DISTINCT कीवर्ड release 1.7.4 में शुरू किया गया है।

आप अद्यतन जीक्यूएल संदर्भ (उदाहरण के लिए पायथन के लिए) here पा सकते हैं।