我想你应该能够做到这一点:
paired_sorted = sorted(zip(List2,List3,List1),key = lambda x: (x[0],-x[1]))
l2,l3,l1 = zip(*paired_sorted)
在行动:
>>> List1 = ['a', 'b', 'c', 'd', 'e']
>>> List2 = [4, 2, 3, 2, 4]
>>> List3 = [0.1, 0.8, 0.3, 0.6, 0.4]
>>> paired_sorted = sorted(zip(List2,List3,List1),key = lambda x: (x[0],-x[1]))
>>> l2,l3,l1 = zip(*paired_sorted)
>>> print l1
('b', 'd', 'c', 'e', 'a')
下面是它如何工作的。首先,我们使用zip
来匹配您的列表中的相应元素。然后,我们根据来自List2的项目和(否定)List3项目对这些元素进行排序。然后,我们只需要使用zip
和参数解包再次取消List1元素 - 尽管如果您想确保在一天结束时有一个列表而不是元组,那么您可以使用列表理解轻松完成。
如果您不能轻易否定List3中的值,例如如果他们是字符串。你需要做的排序在2遍:
paired = zip(List2,List3,List1)
rev_sorted = sorted(paired,reverse=True,key=lambda x: x[1]) #"minor" sort first
paired_sorted = sorted(rev_sorted,key=lambda x:x[0]) #"major" sort last
l2,l3,l1 = zip(*paired_sorted)
(你可以代替lambda x:x[1]
在上面使用operator.itemgetter(1)
如果您愿意)。这是有效的,因为python排序是“稳定的”。它不会重新排列“相等”的元素。
,你需要排序列表2和项目list3,但好您的解决方案一样。 –
@MartijnPieters - 你的也是;-) - 你只是不保留结果。 – mgilson