最近学习python中,遇到了一个案例:
已知若干用户名字及其喜欢的电影清单,现有某用户已看过并喜欢一些电影,然后根据已有数据,查找与该用户爱好最相似的用户,也就是看过并喜欢的电影与该用户最接近的用户,然后从那个用户喜欢的电影中选取一个当前用户还没看过的电影,然后推荐。
示例代码如下:
from random import randrange
data = {
'user'+str(i):{
'film'+str(randrange(1,10)) for j in range(randrange(15))} for i in range (10)}
user = {
'film1','film2','film3'}
similarUser, films = max(data.items(), key=lambda item: len(item[1]&user))
print('历史数据·:')
for u, f in data.items():
print(u,f,sep=':')
print('和你最相似的用户时:',similarUser)
print('他最喜欢看的电影是:',films)
print('他看过的电影中你还没看过的有:',films-user)
看完就迷在第四行,上网搜了一下:
第一:max函数参数有两个,第一个是可迭代对象,第二个是函数;
第二:key后面跟的也是一个函数,函数的返回值为key;
第三:lambda函数,也称lambda表达式,有两个参数,即 lambda item1: item2 ,用法为将参数item1代入item2中,然后有一个新的返回值,用来作为key值。
这样示例代码就解释通了:
1)data为一个字典;items() 为字典中的一个函数,相当于将字典变为一个列表,列表中的每一个元素均是一个元组,对应着字典中的键和值。
dict_items([('user0', {
'film6', 'film7', 'film8', 'film9', 'film2', 'film4', 'film3'}), ('user1', {
'film1', 'film6', 'film7', 'film8', 'film9', 'film2', 'film5'}), ('user2', {
'film1', 'film6', 'film7', 'film8', 'film9', 'film4', 'film3'}), ('user3', {
'film8'}), ('user4', {
'film7', 'film8', 'film9', 'film2', 'film5', 'film4', 'film3'}),
2)data.items()作为一个可迭代对象传入lambda函数中的参数item中,(这里的item仅仅是一个参数哦),其中item[1]正是每个用户的电影清单。
最后带一下运行结果:
历史数据·:
user0:{
'film7', 'film4', 'film3', 'film5', 'film2', 'film8', 'film6'}
user1:{
'film7', 'film4', 'film5', 'film2', 'film8', 'film1'}
user2:{
'film4', 'film5', 'film2', 'film8', 'film1'}
user3:{
'film7', 'film4', 'film3', 'film5', 'film2', 'film8', 'film6', 'film1'}
user4:{
'film7', 'film4', 'film3', 'film5', 'film2', 'film8', 'film6', 'film1'}
user5:{
'film4', 'film3', 'film5', 'film6', 'film1'}
user6:{
'film5', 'film9', 'film6', 'film4'}
user7:{
'film7', 'film4', 'film3', 'film5', 'film2', 'film8', 'film1'}
user8:{
'film7', 'film3', 'film2', 'film8', 'film6', 'film1'}
user9:{
'film7', 'film4', 'film2', 'film6', 'film1'}
和你最相似的用户时: user3
他最喜欢看的电影是: {
'film7', 'film4', 'film3', 'film5', 'film2', 'film8', 'film6', 'film1'}
他看过的电影中你还没看过的有: {
'film7', 'film4', 'film5', 'film8', 'film6'}
Process finished with exit code 0