首页 > 解决方案 > 当第一个元素匹配时如何对嵌套列表进行排序?

问题描述

我有一个嵌套列表,它根据每个子列表的第一个元素进行排序:

t = [['2', '5'], ['8', '10'], ['8', '2'], ['8', '5'], ['9', '0']]

我现在如何按下一个元素对以相同元素开头的子列表进行排序而不影响其他子列表?

例如对 t[1]、t[2] 和 t[3] 进行排序,同时保持其他子列表的顺序:

sort_by_all(t) 
>> [['2', '5'], ['8', '2'], ['8', '5'], ['8', '10'], ['9', '0']]

我的逻辑是首先找到所有以相同元素开头的子列表,按它们的第二个元素对它们进行排序,然后以某种方式将它们放回原始列表中。

标签: pythonalgorithmsorting

解决方案


sorted并且list.sort都可以按字典顺序排序。换句话说,您可以传入一个返回序列的键。在这种情况下,您希望首先将任何值转换为整数。

t = [['2', '5'], ['8', '10'], ['8', '2'], ['8', '5'], ['9', '0']]
# Create new list
print(sorted(t, key=lambda seq: (int(seq[0]), int(seq[1]))))
# Or, sort in place
t.sort(key=lambda seq: (int(seq[0]), int(seq[1])))
print(t)

# Output
[['2', '5'], ['8', '2'], ['8', '5'], ['8', '10'], ['9', '0']]
[['2', '5'], ['8', '2'], ['8', '5'], ['8', '10'], ['9', '0']]

如果您希望它适用于每个子列表具有两个以上元素的列表,请将键替换为:

lambda seq: [int(i) for i in seq]

推荐阅读