2016-10-20 2 views
0

파이썬에서는 목록이 변경되지 않을 때 while 루프를 종료하는 좋은 방법이 있습니까?목록이 변경되지 않을 때 while 루프를 종료하십시오.

나는 데이터 포인트 그룹의 중심을 찾는 것을 포함하는 k 평균 알고리즘을 구현하려고합니다. 중심 위치가 더 이상 변경되지 않으면 루프가 종료됩니다.

루프의 시작 부분에 centroid의 목록을 저장하고 이전 centroid가 현재와 일치 할 때까지 while 루프를 계속 만들 수 있음을 알고 있습니다. 그러나 이것을하기위한 더 평범한 방법이 있습니까?

+0

가능한 복제 [종료하면서 파이썬 루프 (http://stackoverflow.com/questions/16656313/exit-while-loop-in-python) –

+0

http://stackoverflow.com/questions/ 16656313/exit-while-loop-in-python –

+0

"Exit while loop in Python"의 대답을 해석하는 방법을 모르겠지만 변경 목록에 대해 언급하지 않는 것 같습니다. – Vermillion

답변

1

이 솔루션은 공간의 복잡성 측면에서 최적이 아닙니다. 왜냐하면 두 개의 복사본이 유지되기 때문입니다. 그러나 이렇게하면 목록이 변경되었는지 여부를 확인할 수 있습니다.

from copy import deepcopy 


class CList(list): 
    def __init__(self, *args, **kwargs): 
     super(CList, self).__init__(*args, **kwargs) 
     self.reset_state() 

    def reset_state(self): 
     self_copy = deepcopy(self) 
     self.last_state = self_copy 

    @property 
    def has_changed(self): 
     return self.last_state != self 

>>> l = CList([1, 2, 3]) 
>>> l.has_changed 
False 
>>> l.append(4) 
>>> l 
[1, 2, 3, 4] 
>>> l.has_changed 
True 
>>> l.reset_state() 
>>> l.has_changed 
False 
관련 문제