2013-06-25 105 views
4

我想用三列在python中构建一个表格,然后根据需要获取值。 我在想词典是做这件事的最好方法,它具有映射到两个值的键。在python中创建表格

|column1 | column 2  | column 3 | 

| MAC | PORT NUMBER | DPID | 

| Key | Value 1  | Value 2 | 

提议道:

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

//添加端口号,并根据其MAC地址,交换机的DPID作为重点 //包。 src会给你在这种情况下的MAC地址 globe_learning_table[packet.src].add(event.port) globe_learning_table[packet.src].add(dpid_to_str(connection.dpid))

//获取基于DPID的值在其MAC地址 globe_learning_table[packket.src][????]

我不知道如果一个关键点指向两个值我怎么能得到与该关键字相关的特定值。

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

+0

建议使用数据库或使用Pandas数据框 – YXD

回答

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中添加)是一种轻量级对象类,它可以提供一些性能优势和轻量级的内存占用超过正常的自定义类(对于只需要命名字段而不绑定自定义方法的情况对象,例如)。

1

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

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

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数据库或类似的东西更好。

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