def loadMovieLens(path='C:\Users\karan\Desktop\ml-100k'):
# Load data
prefs={}
for line in open(path+'/new1.data'):
(user,title,rating,ts)=line.split('\t')[0:4]
prefs[user][title]=float(rating)
return prefs
我在解析文件时遇到了KeyError。
答案 0 :(得分:2)
你的词典还没有键,所以data[user]
不存在。您可以使用dict.setdefault()
方法让Python为缺少的键添加默认值:
prefs.setdefault(user, {})[title] = float(rating)
上面告诉prefs
添加{}
(空字典)作为user
中指定的密钥的值,如果该密钥尚未存在的话。无论哪种方式,都会返回现有值或新值。
通过一些小的改进,完整的功能变为:
def loadMovieLens(path='C:\Users\karan\Desktop\ml-100k'):
prefs = {}
with open(os.path.join(path, 'new1.data')) as f:
for line in f:
user, title, rating, ts = line.split('\t', 4)[:4]
prefs.setdefault(user, {})[title] = float(rating)
return prefs
我添加了with
语句(因此在完成阅读时文件已正确关闭),使用os.path.join()
构建路径(因此它处理独立于当前操作系统的路径分隔符)并限制分裂为4次。
您也可以切换到csv
模块来处理标签上的拆分。
答案 1 :(得分:0)
for line in open(path+'/new1.data'):
(user,title,rating,ts)=line.split('\t')[0:4]
if prefs[user]:
prefs[user][title]=float(rating)
else:
prefs[user] = {title: float(rating)}
您必须先定义字典prefs[user]
,然后才能向其添加映射
答案 2 :(得分:0)
您尝试设置不存在的更新词典。因此,您必须在使用之前为每个用户生成字典。最好,使用defaultdict
进行自动dict生成:
from collections import defaultdict
def loadMovieLens(path=r'C:\Users\karan\Desktop\ml-100k'):
prefs = defaultdict(dict)
with open(os.path.join(path, 'new1.data')) as lines:
for line in lines:
user, title, rating, _ts = line.split('\t', 3)
prefs[user][title] = float(rating)
return prefs