比较多个列表中的每对列表以创建订单列表

时间:2018-02-18 19:07:31

标签: python compare

a_list = [[70,62],[31,62],[62,71],[70,31],[70,71],[31,71]]

我上面有一个清单。上面的每个列表都有两个元素,第一个元素总是小于第二个元素(例如:第一个列表为30&lt; 62) - 我不比较数字本身(当然30&lt; 62但是如果列表是( 62,30)所以它应该是62 <30)。所以根据我的清单,如何以有效的方式制作整个订单清单?我尝试手动编写,但我的代码运行错误,使用了许多if语句

结果应为:

[70,31,62,71]

比较每对清单后的每一对。

我尝试了3对列表如下:

sort = []
list = [[48, 33], [56, 33], [56, 48]]
for i in list[:-1]:
   for j in list[1:]:
       if i[0] == j[1]:
           sort.extend([i[0],i[1],j[0]])
           break
print(sort)

结果是[53,58,33] 但是对于更大的数字,我仍在检查。

2 个答案:

答案 0 :(得分:0)

您所表达的问题是定向图。您可以使用networkx库来处理这些内容,如:

代码:

def sort_nodes(node_list):
    import networkx as nx
    graph = nx.DiGraph(node_list)
    sorted_nodes = [y[1] for y in sorted(
        (len(neighbors), node) for node, neighbors in graph.pred.items())]
    return sorted_nodes

测试代码:

test_data = (
    dict(
        input=[[70, 62], [31, 62], [62, 71], [70, 31], [70, 71], [31, 71]],
        desired_result=[70, 31, 62, 71]),
    dict(
        input=[[48, 33], [56, 33], [56, 48]],
        desired_result=[56, 48, 33]),
)

import networkx as nx
for test in test_data:
    nodes = sort_nodes(test['input'])
    print(nodes)
    assert nodes == test['desired_result']

结果:

[70, 31, 62, 71]
[56, 48, 33]

答案 1 :(得分:0)

>>> from collections import defaultdict
... from operator import itemgetter
... 
... 
... def solution(pairs_list):
...     d = defaultdict(int)
...     for a, b in pairs_list:
...         d[a]
...         d[b] += 1
... 
...     return [k for k, _ in sorted(d.items(), key=itemgetter(1))]
... 
>>> a_list = [[70, 62], [31, 62], [62, 71], [70, 31], [70, 71], [31, 71]]
>>> solution(a_list)
[70, 31, 62, 71]
>>> b_list = [[48, 33], [56, 33], [56, 48]]
>>> solution(b_list)
[56, 48, 33]