2010-04-09 4 views
3

내 문제의 단순화 된 버전 : 모든 set_state가하는도움말

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

입니다 : 내가 그래서 두 차원 목록에 비트 플래그를 설정하는 데 사용 나는 지능형리스트를

:

self.state |= f 

잘 작동하지만이 함수는 "set_state"__map의 모든 셀에 있어야합니다. 이 제외

[[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의 모든 세포는 같은 것을 내가 할 노력하고있어 그래서 어떤 .STATE 있습니다. 아마도 map/lamda로 잘못된 트리를 짖고 있지만 set_state를 없애고 싶습니다. 그리고 어쩌면 할당이 목록 이해에서 작동하지 않는 이유를 알아 두십시오.

답변

3

예, 잘못된 도구를 사용하고 있습니다. 목록의 이해는 완전히 새로운 값을 반환합니다, 그래서 당신이 할 수 있습니다

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

을하지만 내 본능은 단지 루프에 대한이 사용되어야한다는 것입니다 : 지능형리스트에서

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

을 결과는 표현식이어야합니다. 그것은 가장 안쪽 식 list2에 추가 뭔가를 반환하기 때문에 아무 의미가

 list2.append(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 

: 당신의 두 배 이해력이 단지 설탕이기 때문이다.

기본적으로 목록 내재는 플래그를 업데이트 할 때마다 자체 .__ 맵의 완전한 복사본을 만듭니다. 그것이 당신이 원하는 것이라면, 그걸로 가십시오. 그러나 당신이 단지 기존의지도를 바꾸고 싶다고 생각합니다. 이 경우 이중 for 루프를 사용하십시오.

4

목록 작성은 목록을 만들기위한 것입니다. 당신은 당신이 단지 for 문을 사용해야하므로과 같이, 당신이 만들고있는 실제 목록을 걱정하지 않는 것 :

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

데이터를 현재 위치에서 수정하고 새 목록을 만들지 않으므로 목록 이해가 필요하지 않습니다.

루프를 수행하십시오.

0

파이썬 할당은 명령문이며, lambdas 및 목록 이해에서만 허용되는 표현식이 아닙니다.