代码之家  ›  专栏  ›  技术社区  ›  SamChancer

逐个实例属性迭代类的实例

  •  -1
  • SamChancer  · 技术社区  · 9 年前

    我有一个名为House的类,我想创建一系列实例,这些实例将以网格形式直观排列:

    class House(object):
    
        def __init__(self, row, col):
            self.row = row
            self.col = col
            self.rooms = 0
    

    我想逐行逐列遍历此网格中House的所有实例:

    for row in range(GRIDHEIGHT):
       for col in range(GRIDWIDTH):
    
          thisHouse = House()
          thisHouse.row = row
          thisHouse.col = col
    

    然后在后面的代码中,我想循环遍历已创建的实例。。。

    for row in range(GRIDHEIGHT):
       for col in range(GRIDWIDTH):
    
          ??? something something ??? 
    
             if thisHouse.room =< 1:
                do stuff
             else: 
                thisHouse.room = +1
          etc
    

    “什么东西?”是我不确定如何继续的地方,不知何故,必须通过thisHouse.row和thisHouse.col来搜索thisHous的实例,直到与GRIDHEIGHT和GRIDWITH中的行和列匹配,希望这是有意义的。我不确定如何做到这一点,目前为止的研究表明_dir()可能有用,但似乎显示了属性,而不是属性的内容。

    也许“???什么东西???”应该是。。。

    for thisHouse.row = row and thisHouse.col = col:
    

    但我认为这不会奏效。我正在对这里的一大块代码进行全面检查,所以在这一点上不能只测试这一点,所以建议非常感谢。

    2 回复  |  直到 9 年前
        1
  •  2
  •   leongold    9 年前

    IIUC,您想要实现的目标是:

    import itertools
    
    class House(object):
    
        def __init__(self, row, col):
            self._row = row
            self._col = col
    
    GRIDHEIGHT = 10
    GRIDWIDTH = 10
    
    houses = {(col, row): House(row, col) for col, row in 
              itertools.product(range(GRIDWIDTH), range(GRIDHEIGHT))}
    

    或者,您也可以使用双嵌套字典:

    houses = {col: {row: House(row, col) for row in range(GRIDHEIGHT)} for col in range(GRIDWIDTH)}
    

    通过以下方式进入相关房屋 houses[(col, row)] houses[col][row] :

    for col in range(GRIDWIDTH):
        for row in range(GRIDHEIGHT):
           houses[col][row].foo() # or houses[(col, row)].foo()
    
        2
  •  1
  •   Marco Giordano    9 年前

    你为什么不把问题转过来?您在房屋上存储网格信息,而不是在网格上存储房屋/对象信息。 你可以有一个表示网格的2D数组,然后在每个单元格中,你都有你想要的信息,也就是该单元格中的对象,这取决于你是有一个通用的对象集合,还是像字典一样将它们分开,在字典中你有标签屋、宠物、汽车。

    一些psudo代码:

    for x in grid:
        for cell in x:
           #here you have the cell:
           for obj in cell.objs:
              if (obj is House):
                 do stuff
    

    当然,如果你对你想做的事情有更深入的了解,你可以优化你在单元格中的搜索,比如:

    for x in grid:
        for cell in x:
           #here you have the cell:
           for h in cell.objs["houses"]:
                 do stuff
    

    当然,你仍然可以在house类中保存坐标信息。 以这种方式放置数据,即使分布不均匀,也可以轻松地在房屋中进行迭代,而且还可以进行诸如查找邻居等操作。