避免在python列表中重复

时间:2018-04-25 22:20:51

标签: python python-2.7

我正在尝试为国际象棋游戏制作一些逻辑,并且已经坚持确保我不会在同一个广场上放置多个棋子。我目前的代码如下,但我不确定它在哪里工作。

def add(self, pawn, x_coordinate, y_coordinate, piece_color):
        for each_pawn in self.pawns:
            if each_pawn.x_coordinate == x_coordinate and each_pawn.y_coordinate == y_coordinate:
                pawn.x_coordinate = -1
                pawn.y_coordinate = -1
            else:
                pawn.x_coordinate = x_coordinate
                pawn.y_coordinate = y_coordinate

        self.pawns.append(pawn)

Pawns被设置为班级顶部的空列表。我的想法是我正在创建的棋子进入列表,然后当创建任何后续的棋子时,它正在检查它们是否具有相同的坐标,如果它确实放置在-1,-1方格中,即在棋盘上。我确信它不是特别优雅,但我是Python的新手,希望在我有一些基础工作时回来重构。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

在循环结束时pawn的坐标将对应于测试它的最后一个pawn的结果。在break之后添加pawn.y_coordinate = -1语句。

答案 1 :(得分:1)

class Pawn:
    def __init(x, y):
        self.x_coordinate = x
        self.y_coordinate = y

    @property
    def x_coordinate(self):
        return self.x_coordinate

    @x_coordinate.setter
    def x_corrdinate(x):
        self.x_coordinate = x    

    @property
    def y_coordinate(self):
        return self.y_coordinate

    @y_coordinate.setter
    def y_corrdinate(y):
        self.y_coordinate = y

    def __hash__(self):
        return hash(self.x_coordinate) ^ hash(self.y_coordinate)

    def __eq__(self, other):
        return self.x_coordinate == other. x_coordinate and self.x_coordinate == other.y_coordinate

基本上,写一个具有x和y坐标的类Pawn,覆盖__eq__()方法和__hash__(),当检查if pawn not in pawns:使用__eq__()时,将使用它们验证2 Pawn实例是否相等或不基于它们的x和y坐标。

如何使用?

pawn = Pawn(-1, -1)
if pawn not in pawns:
    pawns.append(pawn)