数据库记录到网格转换

时间:2016-03-17 16:38:56

标签: algorithm

当我们需要将数据库记录转换为网格时,我们遇到了一个问题。

这就是我的意思:

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的额外调用来解决问题。 用例是报告环境,它只允许进行一次查询,然后将过程数据发布到我们需要的内容中。

1 个答案:

答案 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