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

帮助理解python列表

  •  3
  • jtm  · 技术社区  · 14 年前

    我的问题的简化版本:

    我有一个列表理解,用于在二维列表上设置位标志,以便:

    s = FLAG1 | FLAG2 | FLAG3
    [[c.set_state(s) for c in row] for row in self.__map]
    

    所有设置状态都是:

    self.state |= f
    

    这很好,但我必须在地图中的每个单元格中都有“设置状态”功能。地图上的每个单元格都有一个.state,所以我想做的是:

    [[c.state |= s for c in row] for row in self.map]
    

    map(lambda c: c.state |= s, [c for c in row for row in self.__map])
    

    但两者都不起作用(语法错误)。也许我用MAP/LAMDA找错了树,但我想在SET U状态下摆脱它。也许知道为什么作业在列表理解中不起作用

    5 回复  |  直到 14 年前
        1
  •  3
  •   Nathan Shively-Sanders    14 年前

    是的,你用错工具了。列表理解返回一个全新的值,因此您可以执行以下操作:

    self.__map = [[c.state | s for c in row] for row in self.__map]
    

    但我的直觉是你应该使用两个for循环:

    for row in self.__map:
        for c in row:
            c.state |= s
    

    在列表理解中,结果必须是表达式。那是因为你的双重理解只是为了这个:

    list1 = []
    for row in self.__map:
        list2 = []
        for c in row:
            list2.append(c.state | s)
        list1.append(list2)
    self.__map = list1
    

    说不通

            list2.append(c.state |= s)
    

    因为最里面的表达式必须返回一些要附加到 list2 .

    基本上,每次更新标记时,列表理解都会生成一个完整的self.\u map的新副本。如果这是你想要的,那就去吧。但我怀疑你只是想改变现有的地图。在这种情况下,使用double for 循环。

        2
  •  4
  •   Thomas Wouters    14 年前

    列表理解用于创建列表。你似乎不在乎你所列的清单,所以你应该用 for 声明,就像这样:

    for row in self.__map:
        for c in row:
            c.state |= s
    
        3
  •  1
  •   fortran    14 年前

    你不需要一个列表理解,因为你是在原地修改数据,而不是创建一个新的列表。

    做一个循环。

        4
  •  0
  •   Josh Lee ZZ Coder    14 年前

    使用 setattr 功能:

    setattr(c, "state", s)
    

    然后继续读下去 Statementless Python .

        5
  •  0
  •   Łukasz    14 年前

    在python中,赋值是语句,而不是仅在 lambdas 列出理解力。