1

Educationだから私はに添付されているモデルを持っていUserProfileます。このモデルは次のように機能しUserます。さまざまな地域のいくつかの学校に通っています。

私がやろうとしているのは、ユーザーがどこに行ったかに応じて「スコア」を作成することです。基本的に、同じ学校なら10点、同じ都市なら5点、同じ州なら2点…という具合です。

これを試みるためにいくつかの関数を作成しましたが、失敗しました。何かアドバイス?

info = {}
def edu_info(user1):
    user_1_cities = []
    user_1_schools = []
    user_1_state = []
    first_one = Education.objects.filter(owner=user1)
    for i in first_one:
        user_1_cities.append(str(i.city))
        user_1_schools.append(str(i.school))
        user_1_state.append(str(i.state))
        info[str(i.owner.username)] = {}
        info[str(i.owner.username)]['cities'] = user_1_cities
        info[str(i.owner.username)]['schools'] = user_1_schools
        info[str(i.owner.username)]['state'] = user_1_state
    return info

def check_match(user1, user2):
    match_score = {}    
    first_info = edu_info(user1)
    dict = edu_info(user2)
    for item in dict:
        cities = dict[item]['cities']
        #user2 = item
        #print cities
        for city in cities:
            if city in first_info['jmitchel3']['cities']:
                match_score['user'] = 'jmitchel3'
                match_score['user2'] = str(user2.user.username)
                match_score['city'] = city
                print "here! " + str(city)
            else:
                print "not here! " + str(city)

    return match_score




check_match(j,t)
4

1 に答える 1

1

このようなものはどうですか?

1 人のユーザーに関する情報を収集し、そのユーザーの 1 つの辞書を返す関数から始めます。

def edu_info(user1):
    user_1_cities = []
    user_1_schools = []
    user_1_state = []
    first_one = Education.objects.filter(owner=user1)
    for i in first_one:
        user_1_cities.append(str(i.city))
        user_1_schools.append(str(i.school))
        user_1_state.append(str(i.state))
    info = {}
    info['cities'] = user_1_cities
    info['schools'] = user_1_schools
    info['states'] = user_1_state
    return info

次に、2 人のユーザーごとに情報収集関数を 1 回呼び出し、その情報を使用してポイント数を計算する別の関数を用意します。

def check_match(user_1, user_2)
    info_1 = edu_info(user_1)
    info_2 = edu_info(user_2)
    school_points = similarity_points(info_1["schools"], info_2["schools"], 10)
    city_points = similarity_points(info_1["cities"], info_2["cities"], 5)
    state_points = similarity_points(info_1["states"], info_2["states"], 2)
    return school_points + city_points + state_points

関数の中身は、check_matchそれ自体のヘルパー関数にオフロードされます。この関数は、属性の 2 つのリストの交点を見つけ、共有属性の数にポイント値を掛けます。これは、属性リストをセットに変換してから、セット交差演算子を使用することによって行われます。

したがって、similarity_points(["MN","OR","PA", "NJ"],["AZ","NJ","PA"], 2)2 つの一致 (NJ と PA) が検出され、4 が返されます。

def similarity_points(attr_1, attr_2, points)
    """Award a number of points for each shared attribute.

    attr_1 and attr_2 should be lists to compare. 
    """
    number_shared = len(set(attr_1) & set(attr_2))
    return number_shared * points

次に、上記のコードを次のように呼び出すことができます。

wilduck_jmitchel3_points = check_match("Wilduck", "jmitchel3")
于 2013-02-11T22:18:26.957 に答える