Отформатируйте массив кортежей в симпатичную «таблицу» - PullRequest
0 голосов
/ 11 июня 2009

Скажем, у меня есть массив кортежей, которые выглядят так:

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

Вы заметите, что 2-й элемент каждого кортежа стал таблицей "заголовок столбца", и теперь у нас есть строки со значениями идентификаторов и столбцов.

Как бы вы это сделали? Конечно, если у вас есть идея получше, чем на примере таблицы, которую я привел, я был бы рад услышать ваши мысли :)

Прямо сейчас я генерирую диктовку и показываю это в django. Но поскольку мои пары ключей, значения не всегда имеют одинаковый порядок в моих диктовках, то они не могут правильно отображать мои данные.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 июня 2009

Хорошо,

Наконец-то я придумал этот код:

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

Пожалуйста, не стесняйтесь комментировать / улучшать его:)

0 голосов
/ 11 июня 2009

Ваш диктант, вероятно, на правильном пути. Пока вы создаете это слово, вы можете также вести список идентификаторов и список предикатов. Таким образом, вы можете запомнить порядок и построить таблицу, просматривая эти списки.

Использование функции zip в вашем исходном массиве даст вам три списка: список идентификаторов, список предикатов и список значений.

чтобы избавиться от дубликатов, попробуйте функцию reduce:

list_without_duplicates = reduce(
    lambda l, x: (l[-1] != x and l.append(x)) or l, list_with_duplicates, [])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...