Python random.sample不能正常工作?

时间:2012-04-02 09:00:21

标签: python random-sample

我完全了解了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有问题,但我的noobness不能解释它是什么。 任何人都在意我解释为什么我无法获得那些我想要的10个随机MyObjects?

4 个答案:

答案 0 :(得分:2)

看起来Query对象是一个生成器。 random.sample想知道有多少项目可以创建样本。因此,最简单的方法是将要采样的项目放在列表中:

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

答案 1 :(得分:1)

random.sample()没有错。发生的事情是myObjects不是集合。

最有可能的是,myObjects是一个迭代器。在random.sample()中使用它之前,您必须将其转换为列表:

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

答案 2 :(得分:1)

random.sample()适用于列表。显然,MyObject.all()不会返回列表而是返回Query个对象。如果Query至少是可迭代的,那么你可以写:

myObjects = list(MyObject.all())

否则,您必须手动从MyObject.all()创建一个列表。

答案 3 :(得分:1)

您也可以使用:

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

哪个更快,因为它会让数据库执行随机排序,只将10个第一个对象加载到内存中。