Python 基于另一个列表对元组列表进行排序?

Python 基于另一个列表对元组列表进行排序?,python,list,sorting,tuples,Python,List,Sorting,Tuples,有两个列表 list1 = [('ST00003', '009830'), ('ST00003', '005490'), ('ST00003', '005830'), ('ST00003', '251270'), ('ST00002', '111710')] list2 = ['111710', '005830', '009830', '005490', '251270'] 我想按列表2的顺序对列表1进行排序 list3 = [('ST00002', '111710'), ('ST0000

有两个列表

list1 = [('ST00003', '009830'), ('ST00003', '005490'), ('ST00003', '005830'), ('ST00003', '251270'), ('ST00002', '111710')]
list2 = ['111710', '005830', '009830', '005490', '251270']


我想按列表2的顺序对列表1进行排序

list3 = [('ST00002', '111710'), ('ST00003', '005830'), ('ST00003', '009830'), ('ST00003', '005490'), ('ST00003', '251270')]

我想让它像列表3一样排序。有什么好办法吗?

我做了一个中间的
dict
,它从数字字段映射到
列表2中的索引:

list1=[('ST00003','009830'),('ST00003','005490'),('ST00003','005830'),('ST00003','251270'),('ST00002','111710')]
列表2=['111710','005830','009830','005490','251270']
map2={value:索引的索引,枚举中的值(list2)}
打印(map2)
list3=已排序(list1,key=lambda i:map2[i[1]])
打印(列表3)

根据需要输出。

我做了一个中间的
dict
,它从数字字段映射到
列表2中的索引:

list1=[('ST00003','009830'),('ST00003','005490'),('ST00003','005830'),('ST00003','251270'),('ST00002','111710')]
列表2=['111710','005830','009830','005490','251270']
map2={value:索引的索引,枚举中的值(list2)}
打印(map2)
list3=已排序(list1,key=lambda i:map2[i[1]])
打印(列表3)

根据需要输出。

使用dict查找项目:

>>> [*map({i[1]: i for i in list1}.get, list2)]
[('ST00002', '111710'), ('ST00003', '005830'), ('ST00003', '009830'), ('ST00003', '005490'), ('ST00003', '251270')]

(我假设您没有提供一个坏的例子,即,如果您的真实数据不是
list1
list2
之间的1:1对应关系,您就不会让它看起来像这样。)

使用dict查找项目:

>>> [*map({i[1]: i for i in list1}.get, list2)]
[('ST00002', '111710'), ('ST00003', '005830'), ('ST00003', '009830'), ('ST00003', '005490'), ('ST00003', '251270')]

(我假设您没有提供一个坏例子,即,如果您的真实数据不是
list1
list2
之间的1:1对应关系,您就不会让它看起来像这样。)

因为元组的第二个元素是用于排序的键,所以将元组反转,创建一个dict并使用它进行查找。 次要假设:只有当列表1和列表2中的元素数量相同时,此代码才会产生正确的结果

代码:

输出:

{'009830': 'ST00003', '005490': 'ST00003', '005830': 'ST00003', '251270': 'ST00003', '111710': 'ST00002'}
[('ST00002', '111710'), ('ST00003', '005830'), ('ST00003', '009830'), ('ST00003', '005490'), ('ST00003', '251270')]

由于元组的第二个元素是用于排序的键,所以将元组反转并创建一个dict,并使用它进行查找。 次要假设:只有当列表1和列表2中的元素数量相同时,此代码才会产生正确的结果

代码:

输出:

{'009830': 'ST00003', '005490': 'ST00003', '005830': 'ST00003', '251270': 'ST00003', '111710': 'ST00002'}
[('ST00002', '111710'), ('ST00003', '005830'), ('ST00003', '009830'), ('ST00003', '005490'), ('ST00003', '251270')]

请用您尝试过的代码更新您的问题。这是否回答了您的问题@MauriceMeyer:我认为排序顺序是进入
list2
的索引,而不是值本身。您需要做的就是
排序(list1,key=lambda t:list2.index(t[1]))
。但是请注意
list2.index(t[1])
将是
O(n^2)
,不如
len(list2好
变大。请用您尝试过的代码更新您的问题。这是否回答了您的问题@MauriceMeyer:我认为排序顺序是对
list2
的索引,而不是值本身。你所需要做的就是
排序(list1,key=lambda t:list2.index(t[1]))
。但是请注意
list2.index(t[1])
将是
O(n^2)
,不如
len list2变大。这是理想的结果。非常感谢。这是我们想要的结果。非常感谢你。