0

Pythonnoobはこちら。データベースの「data」というオブジェクトに次のものがあり、student_idの各グループから最低スコアを選択するPythonを作成し、見つかった最小レコードごとに一意のObjectIdを取得しますか?

{u'student_id': 197, u'_id': ObjectId('50906d7fa3c412bb040eb88d'), u'type': u'homework', u'score': 10.90872422518918}
{u'student_id': 197, u'_id': ObjectId('50906d7fa3c412bb040eb88e'), u'type': u'homework', u'score': 88.3871242475841}
{u'student_id': 198, u'_id': ObjectId('50906d7fa3c412bb040eb892'), u'type': u'homework', u'score': 17.46279901047208}
{u'student_id': 198, u'_id': ObjectId('50906d7fa3c412bb040eb891'), u'type': u'homework', u'score': 76.18366499496366}
{u'student_id': 199, u'_id': ObjectId('50906d7fa3c412bb040eb895'), u'type': u'homework', u'score': 49.34223066136407}
{u'student_id': 199, u'_id': ObjectId('50906d7fa3c412bb040eb896'), u'type': u'homework', u'score': 58.09608083191365}

お手数をおかけしますが....これが私のコードです...

import pymongo

from itertools import groupby
from pymongo import Connection


connection = Connection('localhost', 27017)

db = connection.students

data = db.grades.find({'type' : 'homework'}).sort([('student_id',pymongo.ASCENDING),('score',pymongo.ASCENDING)])



for student_id, items in groupby(data, lambda s: s['student_id']):
    lowest_score = min(i['score'] for i in items)

    print lowest_score
4

2 に答える 2

2

最小チェックを別の方法で実行して、最小値からのスコアではなくObjectIDを取得できる可能性があると思います。これが私がそれをする方法です:

lowest_id = min(items, key=lambda i: i['score'])['_id']

これで、データベース自体で同様のことを実行できる可能性があり(実際、おそらく)、おそらくそれによってパフォーマンスが向上します。ただし、データセットが扱いにくいものでなければ、上記は問題なく機能する可能性があります。

于 2012-11-09T23:56:26.593 に答える
1

まだstudent_idフィールドにアクセスできるかどうかわからない場合は、次のように置き換えることができます。

lowest_score = min(i['score'] for i in items)

と:

lowest_score = min((i['score'],i['student_id']) for i in items)
于 2012-11-09T23:54:26.800 に答える