タプル [(0, 9), (5, 4), (2, 9), (7, 4), (7, 2)] のリストを並べ替えて [(0, 9), ( 2, 9), (7, 2), (7, 4), (5, 4)].
より具体的には、チェーン (ポリライン) に接続したい一連のエッジ (線分) があります。エッジの順序はランダムなので、並べ替えたいです。各エッジには、開始点と終了点の 2 つのノードがあり、最終的なチェーンの方向と一致する場合と一致しない場合があります。以下のコードは機能しますが、特にこの関数を何度も呼び出す必要があるため、非常に遅くなります。私の場合、ノードは整数ではなくカスタム Node クラスのインスタンスです。平均して、約 10 個のエッジが接続される可能性があります。Ironpythonで実行する必要があります。これの速度を上げる良い方法があるかどうか尋ねてもよろしいですか?どうもありがとうございました!
クリス
from collections import Counter
class Edge():
def __init__(self,nodeA,nodeB,edges):
self.nodes = (nodeA,nodeB)
self.index = len(edges)
edges.append(self)
def chainEdges(edges):
# make chains of edges along their connections
nodesFlat = [node for edge in edges for node in edge.nodes]
if any(Counter(nodesFlat)[node]>2 for node in nodesFlat): return# the edges connect in a non-linear manner (Y-formation)
# find first edge
elif all(Counter(nodesFlat)[node]==2 for node in nodesFlat):# the edges connect in a loop
chain = [min(edges, key=lambda edge: edge.index)]# first edge in the loop is the one with the lowest index
edges.remove(chain[-1])
nodeLast = chain[-1].nodes[-1]
else:# edges form one polyline
chain = [min([edge for edge in edges if any(Counter(nodesFlat)[node]==1 for node in edge.nodes)], key=lambda edge: edge.index)]# first edge is the one with the lowest index
edges.remove(chain[0])
nodeLast = chain[-1].nodes[0] if Counter(nodesFlat)[chain[-1].nodes[0]]==2 else chain[-1].nodes[1]
# loop through remaining edges
while len(edges)>0:
for edge in edges:
if nodeLast in edge.nodes:
chain.append(edge)
edges.remove(edge)
nodeLast = edge.nodes[0] if nodeLast==edge.nodes[1] else edge.nodes[1]
break
return chain
edges = []
for [nodeA,nodeB] in [(0, 9), (5, 4), (2, 9), (7, 4), (7, 2)]:
Edge(nodeA,nodeB,edges)
print [edge.nodes for edge in chainEdges(edges)]
>>>[(0, 9), (2, 9), (7, 2), (7, 4), (5, 4)]