从python列表中删除许多元素

从python列表中删除许多元素,python,list,Python,List,因此,我正在编写一个基本的国际象棋游戏,我已经创建了一个函数来计算一个棋子可以做出的所有动作(全部,我的意思是甚至负数,当前位置和数字>7),每个可能的位置都保存为列表中的元组,但是如何从列表中删除棋盘上的位置? 首先,我尝试了: for i in movements: if (i == piece[1]) or (i[0] < 0) or (i[0] > 7) or (i[1] < 0) or (i[1] > 7): #Where piece[1] is

因此,我正在编写一个基本的国际象棋游戏,我已经创建了一个函数来计算一个棋子可以做出的所有动作(全部,我的意思是甚至负数,当前位置和数字>7),每个可能的位置都保存为列表中的元组,但是如何从列表中删除棋盘上的位置? 首先,我尝试了:

for i in movements:
        if (i == piece[1]) or (i[0] < 0) or (i[0] > 7) or (i[1] < 0) or (i[1] > 7): #Where piece[1] is the current position
            movements.remove(i)
对于运动中的i:
如果(i==工件[1])或(i[0]<0)或(i[0]>7)或(i[1]<0)或(i[1]>7):#其中工件[1]是当前位置
移动。移除(i)
然后我在其他帖子中读到,我不应该在迭代列表时修改它,而是建议使用列表理解,我写了这个

movements = [i for i in movements if not (i == piece[1]) or (i[0] < 0) or (i[0] > 7) or (i[1] < 0) or (i[1] > 7)]
movements=[i为i,如果不是(i==件[1])或(i[0]<0)或(i[0]>7)或(i[1]<0)或(i[1]>7)]
这种解决方案是可行的,但仍然会抛出一些“随机”位置,我不知道为什么

我还想过创建一个我不想要的元素列表,然后从原始列表中逐个删除,但我认为这不是一个好方法

我做错什么了吗?或者我如何解决这个任务? 谢谢

你是说:

movements=[i为i,如果不是((i==件[1])或(i[0]<0)或(i[0]>7)或(i[1]<0)或(i[1]>7))]

通过分离较小的逻辑片段并给它们起有用的名字,您将获得更干净、更容易理解的代码,并且第一次就正确地理解代码

“内部”逻辑是决定给定移动是否有效——请注意反转条件的技巧:我否定每个部分,然后交换
(由于)。或者,我只是想如何直接编写“有效”条件,而不是否定“无效”条件

def is_valid(move, piece):
    return (move != piece[1]) and (i[0] >= 0) and (i[0] <= 7) and (i[1] >= 0) and (i[1] <= 7)

列表理解是一种方法,但我不确定你是否颠倒了你的条件。好吧,我在没有“否”的情况下尝试了它,并在黑板上返回了位置,但它仍然有一种奇怪的行为。如前所述,
not
只适用于
(I==piece[1])
,而不适用于其他条件。您可以将
not
放在每个条件前面,但必须将
s替换为
s(德摩根定律)。或者,在使用
not
之前,可以在整件事情的周围加上括号。或者,您可以创建一个单独的函数来定义
i
值是否有效,这样代码行就不会那么混乱了。是的,我想我忘记了大括号,thxIt有效!你是对的,在“有效”条件下思考更容易,而且我不知道链式比较运算符技术,谢谢!
def is_valid(move, piece):
    return (move != piece[1]) and (0 <= i[0] <= 7) and (0 <= i[1] <= 7)
moves = [move for move in moves if is_valid(move, piece)]