通过另一个列表(Python)的内容对一个列表的内容进行排序

时间:2012-08-02 08:38:41

标签: python list sorting

我有两个由.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保持相关?主要的困难是branch_flows前两部分中的一些分支ID是相反的,但我需要对它们进行排序,就像它们不是一样。

e.g。查看上面的列表,所需的输出将branch_flows排序,branch_flows中的最终列表排在排序列表的第二位(1234-4123-1中为ordered_branches可以与1234-4123-1中的4123-1234-1 AND branch_list相等,因为branch_flows中的顺序有时可能与ordered_branches中的顺序相反)。

我最初尝试使用dictionarys作为查找表,但在阅读逆序部分遇到了麻烦。非常感谢!

2 个答案:

答案 0 :(得分:3)

您需要为Python key函数构建适当的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](也将ValueError更改为KeyError)。


作为一个时空权衡,你可以在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]

答案 1 :(得分: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))。这可能比你通过排序做的任何事情都要好。