我有两个由.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作为查找表,但在阅读逆序部分遇到了麻烦。非常感谢!
答案 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))。这可能比你通过排序做的任何事情都要好。