Django和Python的基础配对机制
我有一个叫做 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)
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
接着,再写一个单独的函数,它会调用你刚才的收集信息的函数,分别为两个用户收集信息,并计算他们的得分。
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
函数的核心部分被放到了一个辅助函数里。这个辅助函数会找出两个属性列表的交集,并将共享的属性数量乘以某个分值。它通过将属性列表转换为集合,然后使用 集合交集运算符 来实现这个功能。
比如,similarity_points(["MN","OR","PA", "NJ"],["AZ","NJ","PA"], 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")