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变大。这是理想的结果。非常感谢。这是我们想要的结果。非常感谢你。