2014-03-26 2 views
0

저는 파이썬에서 2D 무작위 워커 프로그램을 만드는 초심자입니다 (& 아래로 왼쪽, & 오른쪽). 나는 보행자가 방문한 위치로 가지 않기를 바란다.Python의 'in'연산자가 배열에서 작동하지 않습니다.

그래서 일부 배열을 만들었고 하나는 좌표의 히스토리를 수집하는 배열입니다. 그리고 특정 위치에 가능한 옵션을 반환하는 함수도 정의했습니다. [[0, 0], [0, -1], [0 :이 기능이 ...

현재의 역사를

def opt(histo,cur): 
    tmp=[] 
    tmp.append([cur[0]+1,cur[1]]) 
    tmp.append([cur[0]-1,cur[1]]) 
    tmp.append([cur[0],cur[1]+1]) 
    tmp.append([cur[0],cur[1]-1]) 
    tmp.remove(histo[-2]) 
    print "current history : ",histo 
    print "current tmp : ",tmp 
    print "current pos : ",cur 
    for i in tmp: 
    if i in histo: 
     print str(i)+" was detected!!" 
     tmp.remove(i) 
    return tmp 

코드 결과를하지 않는 것 같다 -2, -1, -2], [-1, -1], [-2, -1], [-2,0], [-3, 0], [-3, -1] [-3, -2], [-3, -3], [-4, -3], [-5, -3], [-6, -3], [-7, -3] -7, -2], [-6, -2], [-5, -2], [-5, -1], [-4, -1], [-4, -2]]

현재 tmp : [[-3, -2], [-5, -2], [-4, -3]]

현재 위치 : [-4, -2]

[-3, -2]가 감지되었습니다.

[-4, -3]이 감지되었습니다! 제거 후

: [-5, -2]

....

이유 [-5, -2,이 경우 안전?

+0

목록의 데이터 구조가 잘못되었습니다. 튜플을 포함하는 세트를 사용하십시오. –

+0

형식화 문제와 별도로 질문을 읽을 수 있도록하십시오. 언어는 이해하기가 어렵습니다. –

+3

또한, 반복되는 목록을 돌연변이하는 것은'.remove()'처럼 반복자를 엉망으로 만듭니다. 루프가 모든 것을 덮지는 않습니다. –

답변

0

가능한 최소 변화는 다음과

def opt(histo,cur): 
    tmp=[] 
    tmp.append([cur[0]+1,cur[1]]) 
    tmp.append([cur[0]-1,cur[1]]) 
    tmp.append([cur[0],cur[1]+1]) 
    tmp.append([cur[0],cur[1]-1]) 
    tmp.remove(histo[-2]) 
    print "current history : ",histo 
    print "current tmp : ",tmp 
    print "current pos : ",cur 
    for i in list(tmp): 
    if i in histo: 
     print str(i)+" was detected!!" 
     tmp.remove(i) 
    return tmp 

대답 즉, 그것은 list(tmp)tmp를 변경한다. 그렇게하면 수정중인 목록의 동일한 사본을 반복하지 않습니다.

즉, in은 목록에서 사용할 때 비효율적이며 성능 및 정확성을 이유로 내부 데이터 구조에 튜플을 사용해야합니다. 따라서 모든 참조에 대해 [cur[0]+1, cur[1]](cur[0]+1, cur[1])으로 변경하고 histo의 유형을 세트로 수정해야합니다.

관련 문제