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']]