在Python中,当列表没有改变时,是否有一种结束while循环的好方法?
我正在尝试实现k均值算法,该算法涉及查找数据点组的质心。一旦质心位置不再改变,循环就会终止。
我知道我可以在循环开始时保存质心列表,然后使while循环继续,直到前一个质心与当前质心匹配。但有更多的pythonic方式吗?
答案 0 :(得分: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