mcf*_*fly 12 python sorting list
我有三个不同的列表.我想基于List2对List1进行排序(按升序排序).但是,我在List2中重复了一遍.然后我想按List3对这些重复进行排序(按降序排列).足够困惑?
是)我有的:
List1 = ['a', 'b', 'c', 'd', 'e']
List2 = [4, 2, 3, 2, 4]
List3 = [0.1, 0.8, 0.3, 0.6, 0.4]
Run Code Online (Sandbox Code Playgroud)
我想要的是:
new_List1 = ['b', 'd', 'c', 'e', 'a']
Run Code Online (Sandbox Code Playgroud)
'b'出现在'd'之前,因为0.8> 0.6.'e'出现在'a'之前,因为0.4> 0.1.
有帮助吗?
谢谢!
mgi*_*son 12
我认为你应该能够做到这一点:
paired_sorted = sorted(zip(List2,List3,List1),key = lambda x: (x[0],-x[1]))
l2,l3,l1 = zip(*paired_sorted)
Run Code Online (Sandbox Code Playgroud)
在行动:
>>> 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')
Run Code Online (Sandbox Code Playgroud)
这是它的工作原理.首先,我们使用匹配列表中的相应元素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)
Run Code Online (Sandbox Code Playgroud)
(如果您愿意,可以用以上operator.itemgetter(1)代替lambda x:x[1]).这是有效的,因为python排序是"稳定的".它没有重新排序"相等"的元素.
这需要一个装饰-排序-取消装饰步骤:
decorated = zip(List1, List2, List3)
decorated.sort(key=lambda v: (v[1], -v[2]))
new_list1 = [v[0] for v in decorated]
Run Code Online (Sandbox Code Playgroud)
或者,合并为一行:
new_list1 = [v[0] for v in sorted(zip(List1, List2, List3), key=lambda v: (v[1], -v[2]))]
Run Code Online (Sandbox Code Playgroud)
输出:
>>> List1 = ['a', 'b', 'c', 'd', 'e']
>>> List2 = [4, 2, 3, 2, 4]
>>> List3 = [0.1, 0.8, 0.3, 0.6, 0.4]
>>> new_list1 = [v[0] for v in sorted(zip(List1, List2, List3), key=lambda v: (v[1], -v[2]))]
>>> new_list1
['b', 'd', 'c', 'e', 'a']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1559 次 |
| 最近记录: |