2011-12-16 77 views
2

我一直在使用Python幾年開關,但對於複雜的面向對象的編程並不多,我很少使用字典作爲結構。對於這個應用程序,我試圖在地圖上建立一個位於地理位置的航點的數據庫。嵌套(2-D)字典的類迭代器?

因此,我想創建一個能夠訪問2-D字典結構並執行各種方法的容器類。爲了可用性和可讀性,我試圖實現各種容器方法,但是我很難添加類的功能。

我的容器類

# Python standard libraries 
from collections import defaultdict 
from GeoWayPt import * 
#=========================================================================== 
class GeoWayPtData(): 
    """ Geodetic waypoint data container """ 

    # Nested dictionary structure for equipment/waypoints 
    def equip_dict(self): return defaultdict(self.waypt_dict) 
    def waypt_dict(self): return GeoWayPt 

    def __init__(self): 
     """ Constructor """ 
     # 
     self.AvailEquipIndex = 0 

     # Nested dictionary of equipment with waypoints 
     # 
     # First key for each equipment. 
     # Second key for each waypoint. 
     # [EquipNum][WayptNum] 
     self.dictWayPts = defaultdict(self.equip_dict) 

的一個片段,我不知道如何實現ITER和next方法,以達到在下面的測試腳本的循環功能。

部分我的數據類

class GeoWayPt(): 
    """ Geodetic waypoint container class """ 
    def __init__(self): 
     """ Constructor """ 
     # Equipment ID (integer, starting at 0) 
     self.ID = 0 
     # Equipment class (string description) 
     self.EquipClassStr = '' 

我的測試腳本的

from GeoWayPt import * 
from GeoWayPtData import * 

# 2-D data structure 
data = GeoWayPtData() 

waypt = GeoWayPt() 
waypt.ID = 0 
waypt.EquipClassStr = "foo" 
# Add equipment 0 
data.AddEquip(waypt) 

waypt = GeoWayPt() 
waypt.ID = 0 
waypt.EquipClassStr = "bar" 
# Add waypoint to equipment 0 
data.AddWayPt(0, waypt) 

waypt = GeoWayPt() 
waypt.ID = 1 
waypt.EquipClassStr = "can" 
# Add equipment 1 
data.AddEquip(waypt) 

waypt = GeoWayPt() 
waypt.ID = 1 
waypt.EquipClassStr = "haz" 
# Add waypoint to equipment 1 
data.AddWayPt(1, waypt) 

waypt = GeoWayPt() 
waypt.ID = 1 
waypt.EquipClassStr = "sum" 
# Add another waypoint to equipment 1 
data.AddWayPt(1, waypt) 

# Functionality I'd like: 
for equip in data: 
    for waypt in equip: 
     print waypt.ID, waypt.EquipClassStr 
+0

到底是什麼它要遍歷? – 2011-12-16 20:55:59

回答

1

,而不是試圖以支持迭代中GeoWayPtData,可能更容易遍歷在GeoWayPtData的defaultdict :

for equip in data.dictWayPts.itervalues(): 
    for waypt in equip.itervalues(): 
     print waypt.ID, waypt.EquipClassStr 

當然,你也可以通過添加__iter__能產生航點添加此功能GeoWayPtData:

def __iter__(self): 
     for equip in self.dictWayPts.itervalues(): 
      for waypt in equip.itervalues(): 
       yield waypt 

然後,你可以這樣做:

for waypt in data: 
    print waypt.ID, waypt.EquipClassStr