Python random.sample не работает должным образом? - PullRequest
0 голосов
/ 02 апреля 2012

Я полный пэт с питоном.Но теперь мне нужно простое хранилище, содержащее MyObject-объекты для какого-то проекта.Каждый объект содержит несколько StringProperties, ничего особенного.

Теперь я хочу получить из моего списка MyObjects 10 случайных объектов и сохранить их в каком-то другом массиве.

Итак, я пошел искать и нашел случайный.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 ]

2 голосов
/ 02 апреля 2012

Похоже, объект Query является генератором. random.sample любит знать, сколько предметов существует для создания образца. Поэтому самое простое, что нужно сделать - это поместить элементы для выборки в список:

randomMyObjects = random.sample(list(myObjects), 10)
1 голос
/ 02 апреля 2012

Вы также можете использовать:

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

Что быстрее, потому что это позволит базе данных выполнять произвольный порядок и загружать только 10 первых объектов в память.

1 голос
/ 02 апреля 2012

random.sample() работает со списками. Очевидно, MyObject.all() возвращает не список, а объект Query. Если Query хотя бы итерируемо, вы можете написать:

myObjects = list(MyObject.all())

В противном случае вы должны создать список из MyObject.all() вручную.

1 голос
/ 02 апреля 2012

Нет ничего плохого в random.sample(). Происходит то, что myObjects не является коллекцией.

Скорее всего, myObjects - итератор. Вам придется превратить его в список, прежде чем использовать его в random.sample():

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