gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:31:36 25 4
gpt4 key购买 nike

给定 (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]

但我真的很讨厌这个解决方案,想知道是否有更直接的方法。

编辑

BAD 解决方案可以改进,如下面的评论所述:

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 中的坐标...

编辑

BAD 解决方案还可以做得更好......

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]

但我不知道我对此有何感想...

编辑——我真正想知道的是......

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

我可以用糟糕的解决方案解决寻找坐标的实际问题。但我想更好地理解 list comps。

最佳答案

如果你真的想要一个列表推导式,这里有一个。

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})

这将返回一个排序的 settuple

关于python - Python 中的双列表理解 - 查找边界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41497366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com