Python 过滤列表中嵌套的元组,删除某些索引中的特定值?

Python 过滤列表中嵌套的元组,删除某些索引中的特定值?,python,Python,我试图解决一个问题,根据下面的棋盘格变量和提供的rook位置,从我的格变量中删除任何元素。棋盘包含与rook相同的x值或相同的y值,因为rook只在棋盘上垂直和水平移动 #This portion of the code works correctly! #Generates the grid based on n provided to function grid = [(x, y) for x in range(n) for y in range(n)] #Say we use 4

我试图解决一个问题,根据下面的棋盘格变量和提供的rook位置,从我的格变量中删除任何元素。棋盘包含与rook相同的x值或相同的y值,因为rook只在棋盘上垂直和水平移动

#This portion of the code works correctly!    
#Generates the grid based on n provided to function
grid = [(x, y) for x in range(n) for y in range(n)]

#Say we use 4 as n
#Grid would be [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), #(2, 3), (3, 0), (3, 1), (3, 2), (3, 3)]
现在挑战来了,当我尝试过滤掉任何元组,rook能够命中相同的x值或相同的y值

for x, y in rooks:
        #Isolate x and y value of the rook. In this test, let's use x = 2 and y = 3
        print(list(filter(lambda tuple: (x not in tuple, y not in tuple), grid)))
我的挑战是,当我试图将rook的x值与网格的所有x值进行专门匹配时,我一直在尝试将其合并到我的代码中。我知道要访问tuple的所有x值,我需要tuple[I][0],但不知道如何合并一个快速片段来循环遍历tuple的第一个元素中的所有tuple I


在filter函数中,我能让它在list I变量中的所有元组中旋转多少个?

filter函数的问题是lambda返回一个元组而不是一个布尔值,它将始终被计算为true。您希望函数返回与rook具有相同行或列的所有正方形,因此函数应为:

lambda tuple:x==tuple[0]或y==tuple[1] 以您的例子:

>>> rooks = [[2, 3]]
>>> for x, y in rooks:
        print(list(filter(lambda tuple: x == tuple[0] or y == tuple[1], grid)))

[(0, 3), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 3)]

另外,您可能不应该覆盖tuple变量,可以使用square?

我认为列表理解对于这类事情来说是一个简单的过程

n = 4

grid = [(x, y) for x in range(n) for y in range(n)]

rock = (1, 2)

def reduced_grid(rock, grid):
    return [(x, y) for (x, y) in grid if x != rock[0] and y != rock[1]]


print(reduced_grid(rock, grid))

# [(0, 0), (0, 1), (0, 3), (2, 0), (2, 1), (2, 3), (3, 0), (3, 1), (3, 3)]

通过在以下条件中使用元组部分,可以访问具有列表理解的字段:

[field for field in grid if x == field[0] or y == field[1]]
给你:

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (3, 0), (3, 1), (3, 2)]

上面没有区分x和y坐标。。。这可能会有问题。我认为这跟踪的是车不能击中的方块,而不是车可以击中的方块。是的,还不是100%清楚期望的结果是什么。。。要么是罐头,要么是罐头。。好吧,另一个选择只有两个感叹号是的,对不起!我应该说明的是,我过滤掉了rooks不能命中的,并返回了板上没有rooks wrathok的空格,AirQuid在显示列表理解方面更快。对于可访问的方块/字段,这将是另一种方式