1

我是 python 的一个完整的 nab。但现在我需要一个包含 MyObject 对象的简单存储,用于某些项目。每个对象都包含几个 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 个随机 MyObjects 吗?

4

4 回答 4

2

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

randomMyObjects = random.sample(list(myObjects), 10)
于 2012-04-02T09:03:40.200 回答
2

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

myObjects = list(MyObject.all())

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

于 2012-04-02T09:06:30.530 回答
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 回答