回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个点列表<code>L=[[x1,y1],[x2,y2],...]</code>,我想建立一个通过收集<code>L</code>的相邻点生成的“曲面”列表<code>S=[L1,L2,...]</code>。“曲面”的类型与L的类型相同,也就是说,一系列点(但这些点构成了基于相邻链接的曲面)。然而,我尝试做的还不够快。你知道吗</p>
<p>我使用了一个递归函数<code>F(L, P)</code>,它需要一个点列表<code>L</code>,以及起点<code>P=[x,y]</code>(调用函数时必须从列表<code>L</code>中删除)。然后,它查找<code>P</code>的所有邻居点,并在每个邻居点上回调函数(如果它们存在的话)(在从<code>L</code>中删除它们之后)。当被测点不再具有相邻点时,达到基本情况。你知道吗</p>
<p>因此,当达到所有基本情况时,<code>F(L, P)</code>返回一个点<code>L1</code>列表,这些点构成与<code>P</code>相关联的<code>surface</code>。然后对<code>L</code>的其余点重复这个过程,以此类推,构建<code>L2,L3,...</code>。你知道吗</p>
<pre class="lang-py prettyprint-override"><code>def F(L,P):
nhList=[]
leftP=[P[0]+1,P[1]]
rightP=[P[0]-1,P[1]]
upP=[P[0],P[1]-1]
dwP=[P[0],P[1]+1]
if(upP in L):
L.remove(upP)
nhList.append(upP)
if(dwP in L):
L.remove(dwP)
nhList.append(dwP)
if(leftP in L):
L.remove(leftP)
nhList.append(leftP)
if(rightP in L):
L.remove(rightP)
nhList.append(rightP)
if(nhList!=[]):
rtList=[P]
for ad in nhList:
e=F(L,ad)
rtList+=e
return rtList
else:
return [P]
L=[[0,0],[1,0],[5,3],[1,1],[5,4],[2,2]] # e.g.
S=[]
while(L!=[]):
P=L.pop()
S.append(F(L,P))
print(S)
# Returns [[2, 2]], [[5, 4], [5, 3]], [[1, 1], [1, 0], [0, 0]] as expected
</code></pre>
<p>我希望按照简介中的说明检索列表<code>S</code>,而且效果很好。然而,当我在一个更大的点列表上使用这个过程时(例如包含1百万个点),它会减慢处理速度,有时甚至会达到递归限制。你知道吗</p>
<p>因此,我希望更快地生成列表。你知道吗</p>