我在python中有一个列表列表,其中包含具有不同课程和级别的游戏中的用户分数。我的元组(用户,课程,级别,分数)。我有20个用户4个课程和10个级别。我想要的是创建一个3D矩阵,它将具有维度用户 - 课程级别和价值用户分数。我的元组如下:
(110, u'Math', 1, 5)
(110, u'Sports', 1, 5)
(110, u'Geography', 1, 10)
(112, u'History', 1, 9)
(112, u'History', 2, 10)
... ... ... ... ... ... ..
如何创建3D矩阵(在我没有数据的字段中加零)?
答案 0 :(得分:1)
如果您确实需要该表单中的数据,您可以执行以下操作:
data = [(110, 'Math', 1, 5),
(110, 'Sports', 1, 5),
(110, 'Geography', 1, 10),
(112, 'History', 1, 9),
(112, 'History', 2, 10)] #I'm using Python 3 -- u'' is superfluous
dataDict = {(x,y,z):w for x,y,z,w in data}
users = [110,112] #extend as needed. Also -- easily grabbed by code
subjects = ['Math', 'Sports', 'Geography', 'History'] #etc
levels = [1,2] #etc.
#first create a matrix of the right shape initialized to zeros:
dataMatrix = [[[0 for k in range(len(levels))] for j in range(len(subjects))] for i in range(len(users))]
#then load the nonzeros:
for i,u in enumerate(users):
for j,s in enumerate(subjects):
for k,l in enumerate(levels):
if (u,s,l) in dataDict: dataMatrix[i][j][k] = dataDict[u,s,l]
要查看它,请执行以下操作:
>>> for layer in dataMatrix: print(layer)
[[5, 0], [5, 0], [10, 0], [0, 0]]
[[0, 0], [0, 0], [0, 0], [9, 10]]
第一层是对应于第一个用户的2-D矩阵等
完成所有这些 - 我真的没有任何理由想要使用dataMatrix
而不是dataDict
。