2008-10-27 29 views
7

Hãy tưởng tượng bạn có một thực thể trong kho dữ liệu Google App Engine, lưu trữ liên kết cho người dùng ẩn danh. Bạn muốn thực hiện các truy vấn sau đây SQL, mà không được hỗ trợ:Python: DISTINCT trên bộ kết quả GQuery (GQL, GAE)

SELECT DISTINCT user_hash FROM links 

Thay vào đó bạn có thể sử dụng:

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

Làm thế nào để sử dụng Python một cách hiệu quả nhất để lọc kết quả, vì vậy nó trả về một tập kết quả DISTINCT? Làm thế nào để đếm kết quả DISTINCT?

Trả lời

3

Một tập hợp là cách tốt để đối phó với điều đó:

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

Một gợi ý w/r/t câu trả lời đầu tiên, đó là bộ và dicts khá hơn khi truy xuất kết quả độc đáo một cách nhanh chóng, thành viên trong danh sách là O (n) so với O (1) cho các loại khác, vì vậy nếu bạn muốn lưu trữ dữ liệu bổ sung, hoặc làm điều gì đó giống như tạo ra các đề cập danh sách unique_results, nó có thể là tốt hơn để làm điều gì đó như:

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


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

Một đối tượng được đặt là một bộ sưu tập không có thứ tự các đối tượng có thể băm riêng biệt. (...) Mới trong phiên bản 2.4. http://www.python.org/doc/2.5.2/lib/types-set.html –

+1

Đặt là ổn nếu số lượng bản ghi tương đối nhỏ. Nhưng nếu bạn có nhiều gazillions của hồ sơ trong kho dữ liệu, nó sẽ là khá kém hiệu quả! Một chiến lược tốt hơn sẽ là tính toán trước và lưu trữ kết quả tại thời gian chèn/cập nhật. – sudarkoff

1

Một lựa chọn sẽ được đưa kết quả vào một đối tượng thiết lập:

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

Tập kết quả sẽ bao gồm duy nhất của giá trị khác biệt thông qua vào nó.

Nếu không, việc xây dựng danh sách mới chỉ chứa các đối tượng duy nhất sẽ hoạt động. Một cái gì đó như:

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

Vòng lặp for cũng có thể được cô đặc vào danh sách hiểu.

0

Xin lỗi vì đã khai thác câu hỏi này nhưng trong GAE tôi không thể so sánh các đối tượng như vậy, tôi phải e .key() để so sánh như thế:

Hãy coi chừng, điều này rất không hiệu quả:

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

Nếu ai đã có một giải pháp tốt hơn, xin vui lòng chia sẻ.

+0

Có một câu hỏi khác yêu cầu cách thực hiện điều này trong Datastore và câu trả lời cơ bản là bạn không thể: http://stackoverflow.com/questions/1183102/how-to-get-the-distinct-value-of-one -of-my-models-in-google-app-engine. Tôi đã cố gắng gợi ý một số ý tưởng mơ hồ làm thế nào để làm bất bình thường, nhưng có thể trạng thái của nghệ thuật đã chuyển từ đó. –

5

Làm sống lại câu hỏi này để hoàn thành:

Từ khóa DISTINCT đã được giới thiệu trong release 1.7.4.

Bạn có thể tìm thấy tài liệu tham khảo GQL được cập nhật (ví dụ cho Python) here.

Các vấn đề liên quan