2011-12-16 80 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