当我们需要将数据库记录转换为网格时,我们遇到了一个问题。
这就是我的意思:
u1 | q1 | a12
u1 | q2 | a22
...
u1 | qN | a1N
u2 | q1 | a21
u2 | q2 | a22
...
u2 | qK | a2K
u3 | q1 | a31
u3 | q2 | a32
...
u3 | qL | a3L
...
uM | q1 | aM1
uM | q2 | aM2
...
uM | qR | aMR
M ~ 1000
N,K,L,R ~ 50
===============>
# q1 q2 ... qN qK qL qR
u1 a11 a12 ... a1N - - -
u2 a21 a22 ... - a2K - -
u3 a31 a32 ... - - a3L -
...
uM aM1 aM2 ... - - - aMR
因此,顶部的矩阵反映了数据库中的记录集, 由你(用户),q(问题)订购。 每个用户可能有不同数量的问题答案。
底部矩阵是我们需要转换为某种网格的东西。 正如您所看到的,一些用户可能会或可能不会有一些问题/答案对,这会有一些差距。 "结构"这些差距 非常可以(所以不会先提出前2个问题/答案)。
虽然我们已经有了一些工作算法,但由于遍历了两次数据集,所以它很有气味。
也许有人知道如何最有效地进行转换。
P.S。 不幸的是我们无法改变问题的条件意味着 顶部的矩阵必须具有这种形状,并且无法通过对db的额外调用来解决问题。 用例是报告环境,它只允许进行一次查询,然后将过程数据发布到我们需要的内容中。
答案 0 :(得分:0)
这样的东西?
import os
from sets import Set
data = r"""u1 | q1 | a12
u1 | q2 | a22
u1 | qN | a1N
u2 | q1 | a21
u2 | q2 | a22
u2 | qK | a2K
u3 | q1 | a31
u3 | q2 | a32
u3 | qL | a3L
uM | q1 | aM1
uM | q2 | aM2
uM | qR | aMR"""
s = data.split("\n")
users = {}
questions = Set()
for l in s:
(u, q, a) = l.split("|")
questions.add(q)
if users.has_key(u):
users[u][q] = a
else:
users[u] = {q:a}
# print header
str = "%5s " % " "
for q in questions:
str += "%5s" % q
print str
# print the table
for u in users:
str = ""
str += "%5s " % u
for q in questions:
if users[u].has_key(q):
str += "%5s" % users[u][q]
else:
str += " - "
print str
输出如下:
>>>
q1 qR q2 qK qN qL
u1 a12 - a22 - a1N -
u2 a21 - a22 a2K - -
uM aM1 aMR aM2 - - -
u3 a31 - a32 - - a3L