2012-04-02 18 views
0

私はPythonの完全なnabです。 しかし、私は、いくつかのプロジェクトで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

それは本当にその害のあったクエリオブジェクトでした。私がそれを少し良く理解できるようにしてくれてありがとう。 –

+0

@トゥトゥムスマクシムス:)私はあなたがそれを解決してうれしいです。 –

1

random.sample()に間違いがありません。何が起きているのは、myObjectsはコレクションではないということです。

ほとんどの場合、myObjectsはイテレータです。あなたはrandom.sample()で使用する前に、リストにそれを有効にする必要があります:Queryオブジェクトが生成されるように

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

が見えます。 random.sampleは、サンプルを作成するためにいくつのアイテムがあるか知りたいです。リスト上の

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

リストの理解は、より熟語的に 'list(myObjects)'と書かれています。 –

+0

ありがとうございました。 –

1

また、使用することができます:それはデータベースがランダムな順序をやらせるだけメモリーに10個の最初のオブジェクトをロードしますので、高速である

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

関連する問題