簡體   English   中英

Python中的雙列表理解-查找邊界坐標

[英]Double list comprehension in Python - finding borders coordinates

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

但是問題仍然存在---我只是得到所有的坐標,然后丟掉那些不在計算機中的坐標。

編輯

可以使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]

但是我不知道我對此感覺如何...

編輯-我真正想知道的是...

有沒有一種方法可以進行某種(I dunno)遞歸或循環列表理解,通過直接構建列表來返回所需的結果?

我可以解決解決問題的實際問題。 但我想更好地列出清單。

如果您真的想要列表理解,這里就是一個。

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秒。

作為列表理解也許像這樣

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)

而且這種方法效率更高,因為它不會浪費時間來生產不必要的東西,而只是將其丟棄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM