頂点のリストを近隣のサイズで効率的にグループ化/ネストして、頂点のリストのリストにしようとしています。
近傍サイズは頂点のプロパティであり、v
を呼び出すことで取得できますlen(v.neighbours)
。
私が持っている入力は、頂点のソートされていないリストです。取得しようとしている出力は次のようになります。
[[all vertices with len(v.neighbours) == 1], [... == 2], [... == 4]]
これは、各サブリストに同じ近隣サイズの頂点が含まれ、空のリストなしで小さいものから大きいものへとソートされたリストのリストである必要があります。含まれている頂点の近傍サイズにマップするために、サブリストのインデックスは必要ありません。
私はリスト内包でこれを達成する方法を知っていますが、それはかなり非効率的です:
def _group(V: List[Vertex], max: int) -> List[List[Vertex]]:
return [[v for v in V if v.label == i] for i in range(max)]
さらに、最大近隣サイズをパラメーターとして渡したくありませんが、グループ化中にそれを計算し、グループ化中に空のリストをフィルターで除外する方法も探しています。
中間ステップとして辞書を使用するなど、頂点をグループ化するためのより効率的な方法を検討しましたが、実際の結果を生成することはできませんでした。
頂点のリストをグループ化/ネストする最も効率的な方法を誰かに教えてもらえますか?
よろしくお願いします。以前に投稿されたことがあれば申し訳ありませんが、別の質問で探していたものが見つかりませんでした。
入力を1回パスし、結果を中間辞書に入れ、辞書を目的の出力に変換します。
temp_result = defaultdict(list)
for v in vertices:
temp_result[neighborhood_size(v)].append(v)
max_size = max(temp_result.keys())
return_val = list()
for i in range(max_size):
if temp_result[i]: # check if empty
return_val.append(temp_result[i])
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加