2012-04-20 69 views
2

我正在編寫一個腳本,可以幫助我記錄我們的網絡室。python中包含列表的訪問信息

該腳本背後的想法是,房間是一個列表,其中包含幾個機架列表。機架列表包含與服務器/交換機等相關的稱爲模塊的列表。在模塊列表中是帶有電纜號碼的實際端口。

例如:

[04/02, [MM02, [1, #1992, 2, #1993, 3, #1567 ....], MM03, [1, #1234 .....]], 04/03, [MM01, .........]]] 

04/02 =第一齒條

MM02 =在該機架

1首先模塊=端口號

#1992 =電纜數目

我希望你明白。

我寫的腳本比較房間列表中的電纜數字,看看是否有重複。現在它變得棘手:它應該用另一個端口的機架和模塊替換電纜編號。這應該很容易,因爲模塊和機架是包含端口的列表中的第一個元素,但我不知道如何訪問這些信息。 (我在編程小白)

+5

你會更好地使用字典,而不是列表。這將使數據訪問和操作更容易 – DhruvPathak 2012-04-20 12:46:38

+0

你可以做什麼,但最好的解決方案是使用不同的數據結構。 – 2012-04-20 12:57:54

+0

在我看來,這將會更容易實現爲一個字典,其中的鍵是電纜號碼,其他信息存儲爲字典或自定義類。然後,訪問將會像'room [cable_number] [「rack」]或'room [cable_number] [「module」]''一樣......當然,您可能需要密鑰「rack1」和「rack2」內部詞典,因爲電纜有兩端...... – mgilson 2012-04-20 12:58:18

回答

1

由於在讚揚中提到,在這裏使用了更好的數據結構嵌套dicts

data = { 
    "04/02": { 
     "MM02": {1: "#1992", 2: "#1993", 3: "#1567", ...}, 
     "MM03": {1: "#1234", ...}, 
     ... 
    }, 
    "04/03": { 
     "MM01": ... 
     ... 
    }, 
    ... 
} 

那麼你根本就data["04/02"]["MM02"] = {1: "#1992", 2: "#1993", 3: "#1567", ...}替換值,但是,這有這意味着你需要手動創建子字典的缺點 - 有,但是,solutions to this problem如:

from functools import partial 
from collections import defaultdict 

tripledict = partial(defaultdict, partial(defaultdict, dict)) 
mydict = tripledict() 
mydict['foo']['bar']['foobar'] = 25 

這些不僅在可讀性和實用性,而且訪問速度優勢。

0

這是您正在尋找的Python類。這很簡單,所以如果你是小白,你會說你是,你想學習:閱讀並理解代碼。
在底部給出幾個示例行以顯示功能。對於多個機架,只需創建一個Rack()列表。祝你好運。

class Rack(): 
    def __init__(self, name): 
     self.name = name 
     self.modules = dict() 

    # port_cable_list should be in the form: 
    # [(1, #1992), (2, #1993), (3, #1567)] 
    def add_module(self, name, port_cable_list): 
     self.modules[name] = dict() 
     for port, cable in port_cable_list: 
      self.modules[name][port] = cable 

    def remove_module(self, name): 
     if name in self.modules: 
      del self.modules[name] 

    def add_port(self, module_name, port, cable): 
     if module_name not in self.modules: 
      self.modules[module_name][port] = cable 
      return True 
     return False 

    def remove_port(self, module_name, port): 
     if module_name in self.modules: 
      if port in self.modules[module_name]: 
       del self.modules[module_name][port] 
       return True 
      else: 
       return False 
     return False 

    def module_exists(self, module_name): 
     return module_name in self.modules 

    def port_exists_in_module(self, module_name, port): 
     if self.modules[module_name]: 
      return port in self.modules[module_name] 
     return False 

    def print_module(self, module_name): 
     if self.module_exists(module_name): 
      print "%s\nPort\tCable" % (module_name) 
      for port, cable in self.modules[module_name].items(): 
       print port, "\t", cable 
      print 
      return True 
     return False 

    def print_rack(self): 
     print self.name + ':' 
     for module_name in self.modules.keys(): 
      self.print_module(module_name) 

SomeRack = Rack('04/02') 
SomeRack.add_module("MM02", [(1, '#1992'), (2, '#1993'), (3, '#1567')]) 
SomeRack.add_module("MM03", [(1, '#1234')]) 
SomeRack.print_module("MM03") 
SomeRack.print_rack() 
SomeRack.remove_module("MM03") 
print SomeRack.module_exists("MM03") 
SomeRack.print_rack() 
+3

對於不是特殊的attrs/methods的屬性使用'__X__'樣式的名字是一個非常糟糕的主意。 – 2012-04-20 14:29:52

+0

已將變量'__X__'更新爲'X'。 – gustafbstrom 2012-04-20 19:31:21

相關問題