【问题标题】:how to sort a list by hierarchy and make an html table out of it in python?如何按层次结构对列表进行排序并在python中制作一个html表?
【发布时间】:2023-03-30 20:27:01
【问题描述】:

我正在尝试从 python 列表中排序并制作一个 html 表(列表来自数据库):

[('222', 'Workroom', '111'),
 ('333', 'Setup Part', '222'),
 ('444', 'Scale', '222'),
 ('666', 'Workroom', ''),
 ('888', 'Setup Part', '777'),
 ('777', 'Workroom', '666'),
 ('555', 'Workroom', '111'),
 ('111', 'Workroom', '')]

基于他们的层次结构。每个元组中的第一项表示其 ID,第二项表示描述,第三项表示其“父项”。我如何制作一个程序,在 html 表中以分层形式组织它?

这就是我所说的分层形式的意思,也是我想用数据做的一个例子

【问题讨论】:

  • “分层形式”是什么意思?
  • @vishes_shell 我已经进行了编辑以回答您的问题

标签: python python-3.x sorting hierarchy hierarchical-data


【解决方案1】:

好的,如果我们说父母总是孩子大/因为它在他们之上/我们写:

a = [('222', 'Workroom', '111'),
('333', 'Setup Part', '222'),
('444', 'Scale', '222'),
('666', 'Workroom', ''),
('888', 'Setup Part', '777'),
('777', 'Workroom', '666'),
('555', 'Workroom', '111'),
('111', 'Workroom', '')]

for i,s in enumerate(a):
    if len(s[2])==0:
        a[i] =(s[0],s[1],'000')
        # just to avoid int error

v = sorted(a, key=lambda x: x[0]+str(int(x[0])-int(x[2])))
print v

给出:

[('111', 'Workroom', '000'),
('222', 'Workroom', '111'),
('333', 'Setup Part', '222'),
('444', 'Scale', '222'),
('555', 'Workroom', '111'),
('666', 'Workroom', '000'),
('777', 'Workroom', '666'),
('888', 'Setup Part', '777')]

现在,为了知道级别,我们可以嵌套列表:

z = [];

for r in v:
    x = r[:];
    for n in range(int(r[2][0])):
        x = list([x])
    z.append(x)

# Result:

[('111', 'Workroom', '000'),
 [('222', 'Workroom', '111')],
 [[('333', 'Setup Part', '222')]],
 [[('444', 'Scale', '222')]],
 [('555', 'Workroom', '111')],
 ('666', 'Workroom', '000'),
 [[[[[[('777', 'Workroom', '666')]]]]]],
 [[[[[[[('888', 'Setup Part', '777')]]]]]]]]

现在,制作这个 html 很容易:

只是,将每个元素放入<td> </td>你找到的每个列表中,

也许检查长度是否为 3 找到项目 ==> 关闭<td> 标签!

【讨论】:

    【解决方案2】:

    好吧,如果按层次顺序是指按元组的第一个值对其进行排序,则可以在 python 中使用命令sorted()。这将是输出:

    [('111', 'Workroom', ''), ('222', 'Workroom', '111'), ('333', 'Setup Part', '222'), ('444', 'Scale', '222'), ('555', 'Workroom', '111'), ('666', 'Workroom', ''), ('777', 'Workroom', '666'), ('888', 'Setup Part', '777')]

    现在你可以用 python 来创建一个 html 表了:

    head = '\n<tr>\n\t<th>A</th>\n\t<th>B</th>\n\t<th>C</th>\n</tr>\n'
    body = ''
    for row in sorted(list_of_tuples):
        body += '<tr>\n\t<td>{}</td>\n\t<td>{}</td>\n\t<td>{}</td>\n</tr>\n'.format(row[0], row[1], row[2])
    
    table = '<table>' + head + body + '</table>'
    

    【讨论】:

    • 也许我没有正确解释自己。我想不是按元组的第一项,而是按第三项(父项)与第一项(ID)的相关性对其进行排序。例如,如果父级等于 111,则应在 ID 号为 111 的元组旁边对其进行排序。在这种情况下,您所做的工作有效,但在现实世界中,这些 ID 号将不按顺序排列。
    • 在这种情况下,您可以散列它们或构建一棵树并从那里拉取而不是 list_of_tuples。先排序,后构建
    • @monchitos82 我将如何构建它?
    • 在这里你可以挑选一些好主意: * stackoverflow.com/questions/2598437/… * stackoverflow.com/questions/4174941/… * stackoverflow.com/questions/9858096/… * stackoverflow.com/questions/613183/… 所以,你可以: 1 使用sorted + itemgetter 来完成这项工作(我赞成这个,第二个 URL),2. 插入字典并排序键或 3. 制作二叉树并按 x 位置插入
    • 如果我的最后一条评论没有帮助/清楚:在上面的示例中,将 for 行替换为 for row in sorted(list_of_tuples, key=itemgetter(2)): 并在顶部包含导入:from operator import itemgetter
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2020-12-25
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多