2

我有两个由 .csv 文件创建的列表。第一个由分支 ID 号和相应流的列表组成。第二个是我希望对分支 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 保持相关?主要困难是前两部分中的某些分支 idbranch_flows是颠倒的,但我需要对它们进行排序,就好像它们没有排序一样。

例如,查看上面的列表,所需的输出将以branch_flows某种方式排序,最终列表 inbranch_flows在排序列表中排在第二位(因为1234-4123-1inordered_branches可以等于1234-4123-1 AND 4123-1234-1 in branch_list,因为 in 的顺序branch_flows有时可能与 in 的顺序相反ordered_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_flowssorted(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

从表面上看,你似乎可以用一个 dict-build 和两个列表遍历来做到这一点(毕竟你已经有了排序的顺序)。

就像是:

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 回答