2012-04-02 76 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个第一对象加载到内存中。