当列表没有改变时,循环结束

时间:2016-10-20 20:58:33

标签: python python-3.x while-loop

在Python中,当列表没有改变时,是否有一种结束while循环的好方法?

我正在尝试实现k均值算法,该算法涉及查找数据点组的质心。一旦质心位置不再改变,循环就会终止。

我知道我可以在循环开始时保存质心列表,然后使while循环继续,直到前一个质心与当前质心匹配。但有更多的pythonic方式吗?

1 个答案:

答案 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