3
lst = [(u'course', u'session'), (u'instructor', u'session'), (u'session', u'trainee'), (u'person', u'trainee'), (u'person', u'instructor'), (u'course', u'instructor')]

タプルのリストを上に示しました。次のロジックで並べ替える必要があります。各タプルの2番目の要素は1番目の要素に依存します。たとえば、(コース、セッション)->セッションはコースに依存します。

依存関係の優先度に基づいてソートされたリストが必要です。少ないオブジェクトまたは独立したオブジェクトが最初に来るので、出力は次のようになります。

lst = [course, person, instructor, session, trainee]
4

2 に答える 2

5

トポロジカルソートと呼ばれるものを探しています。ウィキペディアのページには、古典的なカーンとその深さ優先探索アルゴリズムが示されています。Pythonの例はここ(少し古いですが、まだ正常に実行されるはずです)、pypi (安定して再利用可能-ここでコードをオンラインで読むこともできます)とここ(Tarjanのアルゴリズム、その種類は依存関係のサイクルも扱います)指定)、ほんの数例を挙げると。

于 2010-06-30T05:42:01.050 に答える
4

概念的には、リストの内容によって決定されるエッジを持つ有向非巡回グラフを作成してから、グラフでトポロジカルソートを実行する必要があります。これを行うためのアルゴリズムはPythonの標準ライブラリには存在しません(少なくとも、頭から離れて考えることはできません)が、http://wwwなどのサードパーティの実装をオンラインで見つけることができます。 .bitformation.com / art / python_toposort.html

そのWebサイトの関数は、すべての文字列のリスト、、itemsおよび文字列間のペアの別のリスト、を取得しますpartial_order。あなたlstは2番目の引数として渡されるべきです。最初の引数を生成するには、を使用できるitertools.chain.from_iterable(lst)ため、関数呼び出し全体は次のようになります。

import itertools
lst = ...
ordering = topological_sort(itertools.chain.from_iterable(lst), lst)

または、Webサイトの関数を変更して、引数を1つだけ取り、の値から直接グラフにノードを作成することもできますlst

編集topsortリンクされているモジュールAlex Martelliを使用すると、直接渡すことができますlst

于 2010-06-30T05:41:58.253 に答える