对2个不同的列表进行排序,这两个列表都包含相同的公共值

时间:2018-03-28 19:22:20

标签: python

我必须列出如下所示:

list1 = [ ["name1", 100], ["name2", 33], ["name3", 22]]
list2 = [ ["name2", 1], ["name1", -1], ["name3", 0]]

列表包含020个名称

两个列表中的名称完全相同,但整数值不同。

是否可以对list2进行排序,以便名称的顺序与list1中的相同?

名称的顺序各不相同,因此它必须是一个灵活的解决方案,可以对名称进行排序,无论它们放在list2的哪个位置。

我希望输出看起来像这样:
list1 = [ ["name1", 100], ["name2", 33], ["name3", 22]]

list2 = [ ["name1", -1], ["name2", 1], ["name3", 0]]

2 个答案:

答案 0 :(得分:3)

O(n)时间内运行的稍微更优化的解决方案 - 它会从list2中创建一个dict,以便可以避免.index,从而将O(n)的复杂性提高到O(n**2) {1}}:

In [68]: list1 = [ ["name1", 100], ["name2", 33], ["name3", 22]]
    ...: list2 = [ ["name2", 1], ["name1", -1], ["name3", 0]]
    ...: 

In [69]: d_list2 = dict(list2)

In [70]: list2 = [[name, d_list2[name]] for (name, _) in list1]

In [71]: list2
Out[71]: [['name1', -1], ['name2', 1], ['name3', 0]]

答案 1 :(得分:2)

创建一个新列表,其顺序与list2只包含名称的顺序相同。然后,您可以根据list1列表中每个列表中第一个元素(名称)的索引对names进行排序:

names = [l[0] for l in list1]
list2.sort(key=lambda l: names.index(l[0]))
#[['name1', -1], ['name2', 1], ['name3', 0]]