4

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

|column1 |  column 2     | column 3   | 

|  MAC   |  PORT NUMBER  |    DPID    |

|  Key   |  Value 1      | Value 2    |

建议的方式:

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

// 根据 MA​​C 地址添加交换机的端口号和 dpid 作为键 // packet.src 将在这种情况下为您提供 MAC 地址 globe_learning_table[packet.src].add(event.port) globe_learning_table[packet.src].add(dpid_to_str(connection.dpid))

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

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

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

4

5 回答 5

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 或类似的东西可能会更好。

于 2013-06-25T16:23:29.177 回答
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 可以是列表、字典或任何适合您需要的东西。显然,如果它是字典,那么您必须询问您将使用哪种键来访问这些“行”)。

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

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

于 2013-06-25T16:24:09.993 回答
1

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

然而,正如 E 先生所指出的,使用数据库存储信息并在必要时从那里检索可能是更好的设计。这可能不会导致显着的性能损失。

于 2013-06-25T16:23:22.773 回答
1

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

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

于 2013-06-25T18:31:22.600 回答
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
于 2013-06-25T17:16:50.283 回答