【问题标题】:In Python, how can I store table and sort it based on one column?在 Python 中,如何存储表并根据一列对其进行排序?
【发布时间】:2014-09-16 21:52:16
【问题描述】:

我有一个带有列的 HTML 表格

(Id|Name|Address|Phone)

我正在使用beautifulsoup 导入并遍历行。

表中的源数据乱序,但我想按 ID 排序的顺序打印出所有这些信息。

我将这些值保存在哪种数据结构中(每列的不同列表?)以及如何根据 ID 对剩余的 3 列进行排序?

【问题讨论】:

标签: python sorting data-structures


【解决方案1】:

没有很好的包含电池的方法来做到这一点(我知道)。您可以尝试使用内置容器来实现,可能类似于:

data = [(some, headers, go, here),
        (data, from, first, row),
        (data, from, second, row),
        ... ,
        (data, from, last, row)]

然后构建一个自定义键对其进行排序,例如:

import operator

data = data[0] + sorted(data[1:],key=operator.itemgetter(col_num_to_sort_by))

但这有点难看。创建一个自己处理所有这些的自定义类可能更易于维护。

import operator

class Table(list): # inherits from list since it's just a list of lists
    def __init__(self, headers, rows_of_data):
        self.maxcellwidth = 0
        self.headers = headers
        for cell in self.headers:
            self.maxcellwidth = max(len(str(cell)), self.maxcellwidth)
        for row in rows_of_data:
            self.append(row)
            for cell in row:
                self.maxcellwidth = max(len(str(cell)), self.maxcellwidth)
    def sort_by_column(self, sort_by):
        """Sort by column and return a new Table"""
        return Table(self.headers, sorted(self, key=operator.itemgetter(sort_by)))
    def sort_by_columnip(self, sort_by):
        """Sort by column in-place"""
        self.sort(key=operator.itemgetter(sort_by))
    def __str__(self):
        return_value = list()
        header = "|".join(["{0:{1}}".format(header,self.maxcellwidth) for header in self.headers])
        return_value.append(header)
        return_value.append("-" * len(header))
        for row in self:
            return_value.append("|".join(["{0:{1}}".format(cell,self.maxcellwidth) for cell in row]))
        return "\n".join(return_value)

# TEST
>>> headers = ("one","two","three","four")
>>> data = [('1','2','3','5'), ('5','6','7','4')]
>>> table = Table(headers, data)
>>> print(table)
one  |two  |three|four 
-----------------------
1    |2    |3    |5    
5    |6    |7    |4 
>>> table.sort_by_columnip(3)
>>> print(table)
one  |two  |three|four 
-----------------------
5    |6    |7    |4    
1    |2    |3    |5  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多