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

通过一个列表的内容对另一个列表的内容进行排序(Python),python,list,sorting,Python,List,Sorting,我有两个由.csv文件创建的列表。第一个由分支id号和相应流的列表组成。第二个是我希望对branche 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]]

我有两个由.csv文件创建的列表。第一个由分支id号和相应流的列表组成。第二个是我希望对branche 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]]
               ]

我想知道如何排序
branch\u流
与排序
ordered\u分支
的方式相同,但排序后流是否与相同的ID保持关联?主要的困难在于
branch_flows
前两部分中的一些分支ID是反向的,但我需要对它们进行排序,就像它们不是那样

e、 g.查看上面的列表,所需的输出将具有
分支流
排序方式,即
分支流
中的最终列表排在排序列表的第二位(如
有序分支中的
1234-4123-1
可以等于
分支列表中的
1234-4123-1
4123-1234-1
,因为
分支流中的顺序有时可能与
有序分支中的顺序相反


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

从表面上看,似乎您可以通过一个dict构建和两个列表遍历来完成这项工作(毕竟您已经拥有了排序顺序)

比如:

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))。这可能比排序更好。

您需要为Python
排序
函数构造一个适当的
函数

忽略颠倒顺序的问题,这很容易:

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\u流
排序为
sorted(branch\u流,key=key)


您可以通过将
有序分支
转换为字典来加速此过程:

order_dict = dict((x, i) for i, x in enumerate(ordered_branches))
使用
order\u dict[id]
代替
ordered\u分支。索引(id)
使用
order\u 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]

这些代码示例不是有效的Python。你能提供一个可用的实际数据集(或其中的一部分)吗?@Tim Pietzcker I添加了“”以使id号成为字符串。道歉。另外,“…”只是表示列表非常大。为什么分支流中的第二级
[]
?@Tichodroma:没有第二级,只有一个开口
[
太多了。@TimPietzcker ACK,感谢您的第二次编辑。衷心感谢您花了这么多时间给出如此详细的答案。当我尝试实现时,我在“order\u dict=dict((x,I)for I,x in ordered\u Branchs)”行中遇到以下错误-太多的值需要解包。知道是什么原因吗?@user1532369抱歉,我忘记了一个
enumerate
调用。上面已修复。另外,您认为是否可以将一行合并到该行中,当它检测到反向顺序分支时,它将其相应的流值乘以-1?@ecatmur抱歉,我应该更清楚一些,我的意思是,当我试图实现原始的非时空权衡代码时,我不选择重新构建反向顺序分支,因为分支可以在任意顺序中使用多次。即,一些分支是相互连接的(我正在对变电站中的线路间隔流量值进行排序)@user1532369这最好作为一个单独的步骤来完成。您可以像上面那样构造反向分支的
dict
,并在反向分支中使用
if id:(…)
@Vatine我收到一个错误,没有定义拆分,这是针对比python 2.7更新的版本吗?你认为可以实现一些东西吗?当检测到反向分支时,它的流值可以乘以-1,然后按有序分支的顺序排列?@user1532369:我的错,它实际上是字符串ob上的一个方法我已经编辑了代码。至于修改分支流,我认为这不需要太多的更改(基本上,制作一个小的实用程序函数,从dict获取分支流,并在有反向键的情况下进行必要的操作),但如果没有它,代码的didacting值(可能)会更高。
def key(branch):
    id, flows = branch
    return order_dict[id]