2

.csvファイルで作成されたリストが2つあります。1つ目は、ブランチID番号と対応するフローのリストで構成されます。2つ目は、ブランチIDとそれに対応するフローを並べ替える順序です。それらは次のとおりです。

branch_flows = [['1234-2321-1', [55, 76, 3, 55, 6]],
                ['1546-2645-1', [4, 6, 56, 3, 4]],
                // ...
                ['4123-1234-1', [6, 12, -4, 7, 9]]
               ]

ordered_branches = ['1234-2321-1',
                    '1234-4123-1',
                    // ...
                    '1546-2645-1']

branch_flows同じ方法で並べ替える方法を知りたいのですordered_branchesが、並べ替え後もフローが同じIDに関連付けられたままになるのでしょうか。主な問題は、最初の2つの部分のブランチIDのbranch_flows一部が逆になっていることですが、そうでないかのように並べ替える必要があります。

たとえば、上記のリストを見るとbranch_flows、最終的なリストがbranch_flows並べ替えられたリストの2番目に配置されるように並べ替えられます(1234-4123-1の順序は、の順序と逆になることがあるため、の両方のANDordered_branches等しくなる可能性があります) 。 。1234-4123-1 4123-1234-1branch_listbranch_flowsordered_branches

私はもともとルックアップテーブルとして辞書を使おうとしましたが、逆順の部分を読むのに問題がありました。よろしくお願いします!

4

2 に答える 2

3

keyPython関数に適切な関数を作成する必要がありsortます。

逆順の問題を無視すると、非常に簡単です。

def key(branch):
    id, flows = branch
    return ordered_branches.index(id)

逆順の問題を考慮すると、次を使用できます。

def key(branch):
    id, flows = branch
    try:
        return ordered_branches.index(id)
    except ValueError:
        parts = id.split('-')
        id = '-'.join((parts[1], parts[0], parts[2]))
        return ordered_branches.index(id)

branch_flowsこれで、として並べ替えることができますsorted(branch_flows, key=key)


ordered_branches辞書に変えることでこれをスピードアップできます:

order_dict = dict((x, i) for i, x in enumerate(ordered_branches))

ordered_branches.index(id)使用する代わりにorder_dict[id](に変更ValueErrorKeyErrorます)。


時間と空間のトレードオフとして、dictで逆順IDを作成できます。

def reverse_id(id):
    parts = id.split('-')
    return '-'.join((parts[1], parts[0], parts[2]))
order_dict = dict((x, i) for i, x in enumerate(ordered_branches))
order_dict.update((reverse_id(x), i) for x, i in order_dict.items())

これで、キー関数は次のようになります。

def key(branch):
    id, flows = branch
    return order_dict[id]
于 2012-08-02T09:31:09.560 に答える
2

表面的には、1つのdict-buildと2つのリストトラバーサルでこれを実行できるように見えます(結局のところ、ソートされた順序はすでにあります)。

何かのようなもの:

flow_dict = {}
for flow in branch_flow:
    # Sometimes, there's a reversal of the two parts of the key.
    key_parts = flow[0].split('-')
    flow_dict['-'.join(key_parts)] = flow
    flow_dict['-'.join([key_parts[1], key_parts[0], key_parts[2])] = flow

branch_flows = [flow_dict[key] for key in ordered_branches]

dictの構築はO(n)(N個の挿入、それぞれが償却されたO(1))である必要があり、順序付きリストのトラバースはO(n)であり、dictから値をフェッチするのはO(1)である必要があります。これは、並べ替えによって実行できるものよりも優れている可能性があります。

于 2012-08-02T09:31:08.627 に答える