0

Python 2.6.2 を使用しています。graphタプル(ソース、宛先)をキーとして、特定の重みを値として持つ辞書があります。

graph重みの降順でソースに基づいて並べ替えたいと思います。異なる宛先を持つグラフのタプルに複数の同じソースが存在する可能性があります。

graph= {(2, 18): 0, (5, 13): 2, (0, 10): 2, (0, 36): 1, (3, 14): 2, (5, 23): 2, (0, 24): 1, (4, 32): 7, (2, 29): 0, (3, 27): 2, (0, 33): 2, (5, 42): 2, (5, 11): 2, (5, 39): 3, (3, 9): 8, (0, 41): 4, (5, 16): 5, (4, 17): 7, (4, 44): 7, (0, 31): 2, (5, 35): 5, (4, 30): 7}

source_dictソースをキーとし、ソースに基づく累積重みを値 {source:weight} とする中間辞書を作成しました。

source_dict={0: 12, 2: 0, 3: 12, 4: 28, 5: 21}

以下のようにソート機能を実行した後、

source_desc_sort=sorted(source_dict.items(), key=lambda x: x[1], reverse=True)
sortkeys = dict((x[0], index) for index,x in enumerate(source_desc_sort))
graph_sort = sorted(graph.iteritems(), key=lambda x: sortkeys[x[0][0]])

graph_sort以下のように 、ソートされたグラフを取得します。

graph_sort= [((4, 17), 7), ((4, 44), 7), ((4, 30), 7), ((4, 32), 7), ((5, 23), 2), ((5, 35), 5), ((5, 13), 2), ((5, 42), 2), ((5, 11), 2), ((5, 39), 3), ((5, 16), 5), ((0, 10), 2), ((0, 36), 1), ((0, 24), 1), ((0, 33), 2), ((0, 41), 4), ((0, 31), 2), ((3, 14), 2), ((3, 27), 2), ((3, 9), 8), ((2, 29), 0), ((2, 18), 0)]

同じソースのキーの順序が重要ではないことに注意してください。graph_sortたとえば、ソースが 5 のタプルの場合、((5, 23), 2) は ((5, 35), 5) の前または後に来る可能性があります。他より低い値。

これは、2日前から解決しようとしている私の課題です。

追加情報として angle に再定義source_dictsource_dict_angleました , {source:{angle:weight}}

source_dict_angle={0: {0: 2, 90: 4, 180: 6}, 2: {0: 0, 270: 0}, 3: {180: 4, 270: 8}, 4: {0: 7, 180: 21}, 5: {0: 6, 90: 10, 180: 2, 270: 3}}

上記と同じように並べ替えを行うのが好きですが、ソースの角度に基づいています。たとえば、ソースが 4 で角度 180 のデスティネーションを持つタプルは、最も高い値、つまり 21 を持つため、最初に開始する必要があります。ソースが 5 で角度 90 のデスティネーションを持つタプルが続きます。

relation_graphソースに対する目的地の位置情報を持つ中間辞書を持っている {source:{angle:destination:value}}

relation_graph={0: {0: {32: [1], 36: [1], 23: [1], 24: [1], 16: [1]}, 90: {3: [1], 41: [1], 44: [1]}, 180: {33: [1], 10: [1], 31: [1]}}, 1: {}, 2: {0: {18: [1]}, 270: {29: [1]}}, 3: {180: {27: [1], 14: [1], 31: [1]}, 270: {0: [1], 33: [1], 36: [1], 9: [1], 1: [1], 24: [1], 41: [1], 10: [1]}}, 4: {0: {32: [1], 18: [1], 23: [1]}, 180: {0: [1], 33: [1], 44: [1], 14: [1], 15: [1], 17: [1], 21: [1], 41: [1], 27: [1], 30: [1], 31: [1]}}, 5: {0: {42: [1], 11: [1], 23: [1]}, 90: {7: [1], 8: [1], 16: [1], 35: [1]}, 180: {0: [1], 13: [1], 14: [1], 44: [1]}, 270: {1: [1], 2: [1], 39: [1], 29: [1]}}} 

期待される結果

graph_sort_angle= [((4, 17), 7), ((4, 44), 7), ((4, 30), 7), ((5, 35), 5), ((5, 16), 5), ((3, 9), 8), ...

私はまだこれに対する解決策を見つけることができません。私が行った解決策を再利用しようとしていますgraph_sortが、うまくいきません。私はそれを別の方法でしなければならないと感じています。

私が行ったのと同じアプローチを使用する方法はありますgraph_sortか?

いくつかの指針を教えていただければ幸いです。

それまでこの作業を続けます。

追加説明 2013 年 1 月 9 日午後 9 時 30 分: Lennart Regebro

graphの降順の値に基づいて (タプル)のキーを並べ替えたいと思いますsource_dict_angle

graph(ソース、宛先) で構成されますが、source_dict_angleソースと角度の情報、{ソース:{角度:重み}} のみが含まれます。宛先情報はありません。graph最初の例のようにタプルをソートすることはできません。

relation_graphソース、角度、目的地の情報 {source:{angle:destination:value}}が与えられます (計算されません) 。このディクショナリを使用して、どの角度 (0 度、90 度、180 度、または 270 度) を使用して、どのソースとどの宛先がペアになるかを確認します。

だから私たちは

  1. 最初に を参照しsource_dict_angleて、最も高い値を確認します。この例では、角度が 180 度のソース 4 が最高値、つまり 21 になります。

  2. ソース 4 のすべての目的地を からの角度 180 relation_graph、つまり [0, 33, 44, 14, 15, 17, 21, 41, 27, 30, 31] と比較します (存在する場合) graph。はいの場合、(ソース、宛先) タプルを最初の位置、つまり (4, 17) にランク付けします。ソース 4 をソートする必要があるため、これは別の方法でも実行できますgraphrelation_graph. はいの場合、(ソース、宛先) タプルを最初の位置にランク付けします。同じ角度を使用して同じソースを複数の宛先とペアにすることができるため、複数の (ソース、宛先) タプルを持つことができます。例: (4, 17)、(4, 44)、および (4, 30)。つまり、ソース 4 は角度 180 を使用して宛先 17、宛先 44、および宛先 30 に接続するため、タプルの 3 つのペアになります。これら 3 つのタプルのペア間の順序は問題ではありません。

  3. これが完了すると、source_dict_angleすべてのソースが降順でソートされるまで、上記の手順を実行して次に高い値に移動します。

4

1 に答える 1

2

中間辞書をスキップします。これは必要ありません。

ソースでソートするには、次のようにします。

graph_sort = sorted(graph.iteritems(), key=lambda x: x[0][0])

角度でソートするには:

def angle(x):
   key, value = x
   source, destination = key
   return <insert angle calculation here>

graph_sort = sorted(graph.iteritems(), key=angle)

アップデート:

すべてが一緒に属するさまざまなデータを保持するために、さまざまな辞書の負荷を停止する必要があります。すべての情報を保持するアイテムのクラスを作成します。

あなたの質問から収集できるものから、ソース、宛先、および重みを保持するグラフ項目の辞書があります。次に、再びワイトを保持する別の辞書があります。次に、角度を保持する 3 番目のディクショナリがあります。

代わりにこれを行うだけです:

class Graph(object):
    def __init__(self, source, destination, weight, angle):
        self.source = source
        self.destination = destination
        self.weight = weight
        self.angle = angle

並べ替えの問題は簡単です。

于 2013-01-09T17:50:35.463 に答える