2012-04-02 80 views
0

我是一個完整的Python與蟒蛇。 但現在我需要一個包含MyObject對象的簡單存儲器用於某個項目。每個對象都包含一些StringProperties。Python random.sample工作不正常?

現在我想從MyObjects的列表中獲得10個隨機對象,並將它們存儲在其他數組中。

所以我去搜索並找到random.sample並開始實現它。

def get10RandomMyObjects(): 
    # waarders maken 
    dict = {} 
    myObjectsList = [] 

    # Lijst vullen 
    myObjects = MyObject.all() 

    randomMyObjects = random.sample(myObjects, 10) 

    for o in randomMyObjects: 
     dict_myObject = { } 
     #some random property setting 
     myObjectsList.append(dict_myObject) 

    dict['myObjects'] = myObjectsList 
    return dict 

這是我回來的錯誤:

File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/random.py", line 314, in sample 
    n = len(population) 
TypeError: object of type 'Query' has no len() 

所以很明顯的東西是錯誤與random.sample但我noobness不能正是DeCypher它是什麼。 任何人都在意解釋爲什麼我無法獲得那10個隨意的MyObjects,所以我渴望?

回答

1

random.sample()作品:所以做最簡單的事情就是把項目列表中進行採樣。顯然,MyObject.all()不返回一個列表,而是一個Query對象。如果Query至少可迭代的,那麼你可以這樣寫:

myObjects = list(MyObject.all()) 

否則,您必須手動從MyObject.all()創建列表。

+0

確實是那該死的Query對象。感謝讓我更好地理解它。 – 2012-04-02 09:20:06

+0

@TotumusMaximus :)我很高興你解決了它。 – 2012-04-02 09:27:28

1

random.sample()沒有錯。發生的是myObjects不是一個集合。

最可能的是,myObjects是一個迭代器。你必須在random.sample()使用前將其變爲列表:

randomMyObjects = random.sample(list(myObjects),10) 
2

貌似查詢對象爲一臺發電機。 random.sample想知道爲了創建樣本有多少物品。在列表

randomMyObjects = random.sample(list(myObjects), 10) 
+2

列表理解更習慣寫入'list(myObjects)'。 – 2012-04-02 09:04:46

+0

謝謝,更新。 – 2012-04-03 09:42:15

1

你也可以使用:

randomMyObjects = MyObject.all().order_by('?')[:10] 

這是更快,因爲它會讓數據庫做隨機排序,只有10個第一對象加載到內存中。