1

私はPythonを使った完全なナブです。しかし今、私はいくつかのプロジェクトのためにMyObject-objectsを含む単純なストレージが必要です。各オブジェクトには、何も凝ったものではないいくつかのStringPropertiesが含まれています。

次に、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に何か問題がありますが、私の初心者はそれが何であるかを解読できません。私が望む10個のランダムなMyObjectを取得できない理由を誰かが説明してくれますか?

4

4 に答える 4

2

random.sample()リストで動作します。明らかに、MyObject.all()リストではなくQueryオブジェクトを返します。Queryが少なくとも反復可能である場合は、次のように記述できます。

myObjects = list(MyObject.all())

それ以外の場合は、からリストをMyObject.all()手動で作成する必要があります。

于 2012-04-02T09:06:30.530 に答える
2

Queryオブジェクトはジェネレーターのようです。 random.sampleサンプルを作成するためにいくつのアイテムがあるかを知りたいです。したがって、最も簡単な方法は、サンプリングするアイテムをリストに入れることです。

randomMyObjects = random.sample(list(myObjects), 10)
于 2012-04-02T09:03:40.200 に答える
1

に問題はありませんrandom.sample()。何が起こっているのかというと、それmyObjectsはコレクションではありません。

ほとんどの場合myObjects、イテレータです。で使用する前に、リストに変換する必要がありますrandom.sample()

randomMyObjects = random.sample(list(myObjects),10)
于 2012-04-02T09:03:02.860 に答える
1

次のものも使用できます。

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

これは、データベースにランダムな順序付けを実行させ、最初の10個のオブジェクトのみをメモリにロードできるため、より高速です。

于 2012-04-02T09:09:37.293 に答える