以漂亮的“表格”格式化元组数组

0 投票
2 回答
719 浏览
提问于 2025-04-15 12:10

假设我有一个包含元组的数组,长得像这样:

[('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')]

我想把它转换成一个好看的二维数组,这样我就可以通过Django在我的页面上直接显示它。

这个表格看起来会是这样的:

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

你会注意到,每个元组的第二个元素变成了表格的“列标题”,而且现在我们有了带有ID和列值的行。

你会怎么做呢?当然,如果你有比我给出的表格示例更好的主意,我很乐意听听你的想法 :)

现在我正在生成一个字典的字典,并在Django中显示它。但是因为我的键值对在字典中的顺序并不总是相同,所以它无法正确显示我的数据。

谢谢!

2 个回答

0

你的字典里面的字典可能是个不错的思路。在你创建这个字典的同时,可以维护一个ID列表和一个条件列表。这样,你就能记住顺序,并通过循环这些列表来构建表格。

使用 zip 函数处理你的初始数组,会得到三个列表:一个是ID列表,一个是条件列表,还有一个是值列表。

为了去掉重复的项,可以试试 reduce 函数:

list_without_duplicates = reduce(
    lambda l, x: (l[-1] != x and l.append(x)) or l, list_with_duplicates, [])
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

如果你有任何意见或者改进的建议,请随时告诉我哦 :)

撰写回答