在Python中按长度和值对列表的列表进行排序

18

如何对Python列表(包含子列表)排序?例如,我有以下列表:

list1 = [[0, 4, 1, 5], [3, 1, 5], [4, 0, 1, 5]]

排序后我期望得到:

list1 = [[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]

另一个例子。我有以下列表:

list2 = [[4, 5, 2], [2, 5, 4], [2, 4, 5]]

排序后我的期望是:

list2 = [[2, 4, 5], [2, 5, 4], [4, 5, 2]]

起初我想按长度排序,然后在每个子列表中按项目排序。我不想对任何子列表进行排序。

我尝试了以下代码,它帮助我仅按长度排序:

list1.sort(key=len)
2个回答

42

你需要像这样的钥匙:

lambda l: (len(l), l)

如何实现:

使用lambda创建一个tuple,然后可以通过sorted按照需要的方式进行排序。这是因为元组会逐个元素地进行排序。

测试代码:

list1 = [[0, 4, 1, 5], [3, 1, 5], [4, 0, 1, 5]]
print(sorted(list1, key=lambda l: (len(l), l)))

list2 = [[4, 5, 2], [2, 5, 4], [2, 4, 5]]
print(sorted(list2, key=lambda l: (len(l), l)))

结果:

[[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]
[[2, 4, 5], [2, 5, 4], [4, 5, 2]]

0
Python的list.sort()方法是“稳定”的,即比较相等的项的相对顺序不会改变。因此,您还可以通过两次调用sort()来实现所需的顺序:
>>> list1 = [[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]
>>> list1.sort()  # sort by sublist contents
>>> list1.sort(key=len)  # sort by sublist length
>>> list1
[[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接