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