在一个漂亮的“表”中格式化一个元组数组

时间:2009-06-11 08:39:08

标签: python django algorithm

假设我有一组看起来像这样的元组:

[('url#id1', 'url#predicate1', 'value1'),
('url#id1', 'url#predicate2', 'value2'),
('url#id1', 'url#predicate3', 'value3'),
('url#id2', 'url#predicate1', 'value4'),
('url#id2', 'url#predicate2', 'value5')]

我希望能够返回一个漂亮的2D数组,以便能够通过django在我的页面中“显示”它。

表格看起来像这样:

[['', 'predicate1', 'predicate2', 'predicate3'],
['id1', 'value1', 'value2', 'value3'],
['id2', 'value4', 'value5', '']]

你会注意到每个元组的第二项成为表“列的标题”,我们现在有了包含id和列值的行。

你会怎么做?当然,如果你有更好的想法,而不是使用我给出的表格示例,我会很高兴你的想法:)

现在我正在生成dict的dict并在django中显示。但是作为我的密钥对,我的dicts中的值并不总是相同的顺序,那么它无法正确显示我的数据。

谢谢!

2 个答案:

答案 0 :(得分:0)

你的dict dict可能是在正确的轨道上。在创建dict的dict时,您还可以维护一个id列表和一个谓词列表。这样,您可以通过循环遍历这些列表来记住排序并构建表。

使用初始数组上的zip函数将给出三个列表:id列表,谓词列表和值列表。

要删除重复项,请尝试reduce函数:

list_without_duplicates = reduce(
    lambda l, x: (l[-1] != x and l.append(x)) or l, list_with_duplicates, [])

答案 1 :(得分:0)

确定,

最后我想出了那段代码:

columns = dict()
columnsTitles = []
rows = dict()
colIdxCounter = 1 # Start with 1 because the first col are ids 
rowIdxCounter = 1 # Start with 1 because the columns titles

for i in dataset:
    if not rows.has_key(i[0]):
        rows[i[0]] = rowIdxCounter
        rowIdxCounter += 1
    if not columns.has_key(i[1]):
        columns[i[1]] = colIdxCounter
        colIdxCounter += 1
        columnsTitles.append(i[1])

toRet = [columnsTitles]
for i in range(len(rows)):
    toAppend = []
    for j in range(colIdxCounter):
        toAppend.append("")
    toRet.append(toAppend)

for i in dataset:
    toRet[rows[i[0]]][columns[i[1]]] = i[2]

for i in toRet:
    print i

请不要犹豫,评论/改进它:)