0

オブジェクトのリストがあります

main_streets = [street1, street2, street3 ...]

各ストリートにはノードの順序付きリストがあります

street.nodes = [nd1, nd2, nd3]

すべての通りは実生活では互いに続きます (したがって、開始/終了ノードを共有します) が、main_streets リストはこの現実を表していません。

main_streets を注文するにはどうすればよいですか? ありがとう

4

1 に答える 1

2

通りが 1 つの連続したチェーンを形成している場合、次のように並べ替えることができます。まず、接続されたすべての道路のペアを作成します。

>>> pairs = [(a, b) for a in main_streets for b in main_streets if a.nodes[-1] == b.nodes[0]]

次に、どちらが最初の通りかを決定します。

>>> seconds = [pair[1] for pair in pairs]
>>> ordered = [s for s in main_streets if s not in seconds]
>>> if len(ordered) > 1:
>>>     raise Exception("Error: There is not one continuous chain.")

次に、通りのチェーンを構築します。

>>> unordered = [s for s in main_streets if s not in ordered]
>>> for i in range(len(unordered)):
>>>     for (j, s) in enumerate(unordered):
>>>         if s.nodes[0] == ordered[-1].nodes[-1]:
>>>             ordered.append(unordered.pop(j))
>>>             break

チェーンに切れ目がある場合 (つまり、すべてが接続されていない場合)、unordered反復が完了した後もアイテムが含まれます。複数のチェーン セグメントがある場合は、最初のorderedリストから始めて、上記の最後のセクションをそれらのアイテムごとに個別に実行できます。

于 2013-01-30T18:03:54.093 に答える