Python 基于两个不同列表项的多项目排序和重新排序/改组?
我有一个嵌套列表,如下所示:Python 基于两个不同列表项的多项目排序和重新排序/改组?,python,sorting,Python,Sorting,我有一个嵌套列表,如下所示: li = [['m', 'z', 'asdgwergerwhwre'], ['j', 'h', 'asdgasdgasdgasdgas'], ['u', 'a', 'asdgasdgasdgasd'], ['i', 'o', 'sdagasdgasdgdsag']] 我想按字母顺序对列表进行排序,但使用每个子列表中的第一个或第二个元素。对于上述示例,所需输出为: ['a', 'u', 'asdgasdgasdgasd']
li = [['m', 'z', 'asdgwergerwhwre'],
['j', 'h', 'asdgasdgasdgasdgas'],
['u', 'a', 'asdgasdgasdgasd'],
['i', 'o', 'sdagasdgasdgdsag']]
我想按字母顺序对列表进行排序,但使用每个子列表中的第一个或第二个元素。对于上述示例,所需输出为:
['a', 'u', 'asdgasdgasdgasd']
['h', 'j', 'asdgasdgasdgasdgas']
['i', 'o', 'sdagasdgasdgdsag']
['m', 'z', 'asdgwergerwhwre']
实现这种排序的最佳方法是什么?您可以使用内置方法来完成其中的一部分。如果你想改变列表的打印方式,你必须改变列表的顺序,但这并不难
def rev(li):
for l in li:
l[0], l[1] = l[1], l[0]
return li
new_list = sorted(rev(li))
如果您想根据特定索引对列表进行排序,可以使用
排序(li,key=lambda li:li[index])
作为我们执行某些转换的第一步(交换前两项-如果需要),并在第二步执行简单的排序:
>>> sorted(map(lambda x: sorted(x[:2]) + [x[2]], li))
[['a', 'u', 'asdgasdgasdgasd'],
['h', 'j', 'asdgasdgasdgasdgas'],
['i', 'o', 'sdagasdgasdgdsag'],
['m', 'z', 'asdgwergerwhwre']]
这不仅仅是排序,而是内部转换我不认为他只是想交换l[1]和l[0],我认为他想对它们进行排序。如果你有l[1],l[0]=min(l[1],l[0]),max(l[1],l[0]),你的代码就可以工作了,谢谢。我的排序非常大,因此我最终使用了您的代码并将其重构为一种理解,这大大加快了排序速度:
x=sorted(sorted(x[:2])+x[2]表示li中的x)
import pprint
li = [['m', 'z', 'asdgwergerwhwre'],
['j', 'h', 'asdgasdgasdgasdgas'],
['u', 'a', 'asdgasdgasdgasd'],
['i', 'o', 'sdagasdgasdgdsag']]
for _list in li:
_list[:2]=sorted(_list[:2])
pprint.pprint(sorted(li))
>>>
[['a', 'u', 'asdgasdgasdgasd'],
['h', 'j', 'asdgasdgasdgasdgas'],
['i', 'o', 'sdagasdgasdgdsag'],
['m', 'z', 'asdgwergerwhwre']]