我想在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][????]
我不确定一个键是否指向两个值如何获得与该键关联的特定值。
我愿意使用任何其他数据结构,如果它可以构建这个动态表并在必要时给我特定的值。
答案 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