在python中创建一个表

时间:2013-06-25 16:09:25

标签: python

我想在python中使用三列构建一个表,然后根据需要获取值。 我认为字典是最好的方法,它具有两个值的键映射。

|column1 |  column 2     | column 3   | 

|  MAC   |  PORT NUMBER  |    DPID    |

|  Key   |  Value 1      | Value 2    |
建议的方式:

//定义全局学习表 globe_learning_table = defaultdict(set)

//根据MAC地址作为密钥添加交换机的端口号和dpid // packet.src在这种情况下会给你MAC地址 globe_learning_table[packet.src].add(event.port) globe_learning_table[packet.src].add(dpid_to_str(connection.dpid))

//根据MAC地址获取DPID的值 globe_learning_table[packket.src][????]

我不确定一个键是否指向两个值如何获得与该键关联的特定值。

我愿意使用任何其他数据结构,如果它可以构建这个动态表并在必要时给我特定的值。

5 个答案:

答案 0 :(得分:3)

或许这样的事情?

>>> global_learning_table = collections.defaultdict(PortDpidPair)
>>> PortDpidPair = collections.namedtuple("PortDpidPair", ["port", "dpid"])
>>> global_learning_table = collections.defaultdict(collections.namedtuple('PortDpidPair', ['port', 'dpid']))
>>> global_learning_table["ff:" * 7 + "ff"] = PortDpidPair(80, 1234)
>>> global_learning_table
defaultdict(<class '__main__.PortDpidPair'>, {'ff:ff:ff:ff:ff:ff:ff:ff': PortDpidPair(port=80, dpid=1234)})
>>>

命名元组可能适用于每一行,但是根据此表的大小,使用sqlite db或类似的东西可能会更好。

答案 1 :(得分:3)

为什么要上字典?为什么不是一个命名元组的列表,或者你定义的某个类的对象的集合(列表,字典)(每列的属性)?

出了什么问题:

class myRowObj(object):
    def __init__(self, mac, port, dpid):
        self.mac  = mac
        self.port = port
        self.dpid  = dpid


myTable = list()
for each in some_inputs:
    myTable.append(myRowObj(*each.split())

......或类似的东西?

(注意:myTable可以是一个列表,也可以是一个字典或任何适合您需要的字体。显然,如果它是一个字典,那么你必须要问你将用什么类型的密钥来访问这些“行”。) / p>

这种方法的优点是你的“行对象”(你以某种方式命名,对你的应用程序域更有意义)可以实现你选择的任何语义。这些对象可以验证和转换实例化时提供的任何值,计算任何派生值等。您还可以定义对象的字符串和代码表示(当一个行用作字符串或某些类型的时,隐式转换)开发和调试或序列化(例如 _str_ _repr_ 特殊方法。

命名元组(在Python 2.6中添加)是一种轻量级对象类,与普通自定义类相比,它可以提供一些性能优势和更小的内存占用(对于只需要命名字段而不将自定义方法绑定到这些对象的情况,例如)。

答案 2 :(得分:1)

如果它足够小,可以存储在内存中,并且您希望它是一个数据结构,那么您可以创建一个包含值1和1的类。 2并将其用作字典映射的值。

然而,正如E先生指出的那样,使用数据库来存储信息并从中进行必要的检索可能是更好的设计。这可能不会导致重大的性能损失。

答案 3 :(得分:1)

要记住的另一个选择是内存中的SQLite表。有关基本示例,请参阅Python SQLite文档:

11.13。 sqlite3 - SQLite数据库的DB-API 2.0接口 - Python v2.7.5文档 http://docs.python.org/2/library/sqlite3.html

答案 4 :(得分:0)

我认为你有两个截然不同的目标。您需要一个有代表性的数据结构,并且(在我阅读时)您希望以可读的形式打印它。以表格形式打印的内容不会以二维方式存储在计算机内部;表格呈现是一个视觉比喻。

假设我对你想要完成的事情是正确的,我的方法是:a)保持简单,b)使用正确的模块来节省工作。

正确表示您的信息的最简单的数据结构在我看来是字典中的字典。像这样:

foo = {'00:00:00:00:00:00': {'port':22, 'dpid':42},
       '00:00:00:00:00:01': {'port':23, 'dpid':43}}

我找到的用于快速和脏表打印的最佳模块是prettytable。您的代码看起来像这样:

foo = {'00:00:00:00:00:00': {'port':22, 'dpid':42},
       '00:00:00:00:00:01': {'port':23, 'dpid':43}}

t = PrettyTable(['MAC', 'Port', 'dpid'])
for row in foo:
    t.add_row([row, foo[row]['port'], foo[row]['dpid']])

print t