Python中的双列表理解-查找边界坐标

Python中的双列表理解-查找边界坐标,python,Python,给定(x,y),我想要收藏: [(0,0),(0,y),(1,0),(1,y),(2,0),(2,y)...(x-1,0),(x-1,y),(x,0),(x,y), (0,1),(x,1),(0,2),(x,2)...(0,y-1),(x,y-1)] (我真的不在乎它是列表、集合还是任何其他类型的集合。) 我已经尝试过几种排列的列表组合,但没有任何效果 我找到了一个糟糕的解决办法: all_points = list(itertools.product([x for

给定
(x,y)
,我想要收藏:

[(0,0),(0,y),(1,0),(1,y),(2,0),(2,y)...(x-1,0),(x-1,y),(x,0),(x,y),
             (0,1),(x,1),(0,2),(x,2)...(0,y-1),(x,y-1)]
(我真的不在乎它是列表、集合还是任何其他类型的集合。)

我已经尝试过几种排列的列表组合,但没有任何效果

我找到了一个糟糕的解决办法:

all_points = list(itertools.product([x for x in range(x+1)], [y for y in range(y+1)]))
border = [xy for xy in all_points if xy[0]==0 or xy[0]==x or xy[1]==0 or xy[1]==y]
但我真的很讨厌这个解决方案,我想知道是否有更直接的方法

编辑

坏的解决方案可以做得更好,如下评论中所述:

all_points = list(itertools.product(range(x+1), range(y+1))
border = [xy for xy in all_points if xy[0]==0 or xy[0]==x or xy[1]==0 or xy[1]==y]
但问题仍然存在——我只是得到了所有的坐标,然后放弃了那些不在comp中的坐标

编辑

坏的解决方案可以做得更好

border = [xy for xy in itertools.product(range(x+1), range(y+1)) if xy[0]==0 or xy[0]==x or xy[1]==0 or xy[1]==y]
但我不知道我对此有何感想

编辑--我真正想知道的是…

有没有一种方法可以通过直接构建列表来实现某种(我不知道)递归或循环列表理解,从而返回所需的结果


我可以解决实际问题,找到坐标与坏的解决方案。但是我想更好地了解列表。如果你真的想了解列表,这里有一个

l = sorted({j for i in [[[(i, y), (i, 0)] for i in range(x+1)] + [[(x, i), (0, i)] for i in range(y+1)]][0] for j in i})

这将返回
元组的排序

可能如下所示

def border(x,y):
    return [ (a,b) for a in range(x+1) for b in range(y+1) if 0 in (a,b) or x==a or y==b ]
但我宁愿直接生产我需要的东西,而不是寻找一些深奥的和/或潜在的低效的方法,最好是清晰而不是聪明

像这样

def border(x,y):
    for p in range(x+1):
        yield (p,0)
        yield (p,y)
    for p in range(1,y):
        yield (0,p)
        yield (x,p)

这一个更有效,因为它不会浪费时间产生不必要的东西,只是为了被丢弃

为什么
[x代表x在范围(x)]
而不仅仅是
范围(x)
(我不建议重复使用这样的名称)?为什么不单独构建边并将它们粘在一起?构造一条边的理解非常简单。然后我做了4次同样的事情。我试着观察干燥的空气。我知道这有点深奥,因为我已经解决了这个问题。但我正试着把我的脑袋绕到列表上。语法。@TigerhawkT3我是通过一个带有for循环的列表comp的反复试验得出上述结论的。。。这在当时是有道理的。但是你所说的更有意义。随着
x
y
变得越来越大,网格中由边界点组成的百分比越来越小,因此任何涉及过滤网格的解决方案都是一个坏主意——它使本应是二次线性算法的算法变为二次线性算法。当然,如果
x
y
很小,那就没关系了。谢谢!(我甚至不在乎它是否被排序,但这确实有助于检查…)为什么不
范围内的p(x+1)
,然后你可以跳过前四个收益率语句?@rassar很好,我尝试了几个组合,它们不起作用,这些是有问题的点,所以我就这样做