Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a table in python

Tags:

python

I want to build a table in python with three columns and later on fetch the values as necessary. I am thinking dictionaries are the best way to do it, which has key mapping to two values.

|column1 |  column 2     | column 3   | 

|  MAC   |  PORT NUMBER  |    DPID    |

|  Key   |  Value 1      | Value 2    |

proposed way :

// define a global learning table globe_learning_table = defaultdict(set)

// add port number and dpid of a switch based on its MAC address as a key // packet.src will give you MAC address in this case globe_learning_table[packet.src].add(event.port) globe_learning_table[packet.src].add(dpid_to_str(connection.dpid))

// getting value of DPID based on its MAC address globe_learning_table[packket.src][????]

I am not sure if one key points to two values how can I get the particular value associated with that key.

I am open to use any another data structure as well, if it can build this dynamic table and give me the particular values when necessary.

like image 517
Kavit Shah Avatar asked Feb 17 '23 03:02

Kavit Shah


2 Answers

Why a dictionary? Why not a list of named tuples, or a collection (list, dictionary) of objects from some class which you define (with attributes for each column)?

What's wrong with:

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())

... or something like that?

(Note: myTable can be a list, or a dictionary or whatever is suitable to your needs. Obviously if it's a dictionary then you have to ask what sort of key you'll use to access these "rows").

The advantage of this approach is that your "row objects" (which you'd name in some way that made more sense to your application domain) can implement whatever semantics you choose. These objects can validate and convert any values supplied at instantiation, compute any derived values, etc. You can also define a string and code representations of your object (implicit conversions for when one of your rows is used as a string or in certain types of development and debugging or serialization (_str_ and _repr_ special methods, for example).

The named tuples (added in Python 2.6) are a sort of lightweight object class which can offer some performance advantages and lighter memory footprint over normal custom classes (for situations where you only want the named fields without binding custom methods to these objects, for example).

like image 102
Jim Dennis Avatar answered Mar 29 '23 09:03

Jim Dennis


Something like this perhaps?

>>> 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)})
>>>

Named tuples might be appropriate for each row, but depending on how large this table is going to be, you may be better off with a sqlite db or something similar.

like image 29
dav Avatar answered Mar 29 '23 10:03

dav