Итератор класса для вложенного (2-D) словаря? - PullRequest
2 голосов
/ 17 декабря 2011

Я уже несколько лет использую python, но не слишком много для сложного объектно-ориентированного программирования, и я редко использую словари в качестве структуры. Для этого приложения я пытаюсь создать базу данных о географических точках на карте.

Как таковой, я хочу создать контейнерный класс, способный обращаться к двумерной структуре словаря и выполнять различные методы. В целях удобства использования и удобочитаемости я пытаюсь реализовать различные методы контейнера, но мне трудно добавить функциональность класса.

Фрагмент моего контейнера класса

# 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 и следующие методы для достижения функциональности зацикливания в тестовом скрипте ниже.

Часть моего класса данных

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

1 Ответ

1 голос
/ 17 декабря 2011

Вместо того, чтобы пытаться поддерживать итерацию в GeoWayPtData, может быть проще выполнить итерацию по умолчанию в GeoWayPtData:

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

Конечно, вы также можете добавить эту функцию в GeoWayPtData, добавив __iter__, который возвращает путевые точки:

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...