当并非所有值都存在时,对列表列表进行排序

时间:2017-04-30 04:06:19

标签: python python-2.7 list sorting lambda

我正在尝试对列表列表进行排序,但内部列表的长度不同。例如:

version_list = [[1, 1, 2], [1, 0], [1, 3, 3], [1, 0, 12], [1, 0, 2], [2, 0, 0], [1, 1, 1]]

在没有第三个值的情况下,可以假设为0.我试图使用:

revision = sorted(version_list, key=lambda x: (x[2] if x[2] >= 0 else x[2] = 0))

因为我知道

revision = sorted(version_list, key=lambda x: x[1])
revision = sorted(version_list, key=lambda x: x[0])

两者都不然。

期望的结果是:

[[1, 0], [1, 0, 2], [1, 0, 12], [1, 1, 1], [1, 1, 2], [1, 3, 3], [2, 0, 0]]

非常感谢任何帮助或建议。

3 个答案:

答案 0 :(得分:1)

您可以在key中返回一个元组,其中第三个值取决于子列表的长度(如果子列表不是长度3,则使用0):

>>> sorted(version_list, key=lambda x: (x[0], x[1], x[2] if len(x) == 3 else 0))
[[1, 0], [1, 0, 2], [1, 0, 12], [1, 1, 1], [1, 1, 2], [1, 3, 3], [2, 0, 0]]

如果您想先对特定索引进行排序,可以随机播放x[0]x[1]x[2] if len(s) == 3 else 0部分。

如果您希望它更通用,您还可以使用显式函数:

def padded(lst):
    desired_length = 3
    fallback_value = 0
    x = [fallback_value]*desired_length
    x[:len(lst)] = lst      # inserts list
    return x

sorted(version_list, key=padded)

然而,如comments (Dogan Askan)中所述,如果没有负值,您根本不需要key - 函数,因为列表比较有效(正确)在您的样本案例中)即使长度不同:

sorted(version_list)  # no key function

答案 1 :(得分:0)

这就是你追求的吗?默认排序似乎完全符合您的需要。

sorted(version_list)
Out[103]: [[1, 0], [1, 0, 2], [1, 0, 12], [1, 1, 1], [1, 1, 2], [1, 3, 3], [2, 0, 0]]

答案 2 :(得分:0)

为了支持艾伦的答案,Python的sorted()内置函数使用了引擎盖下的Timsort算法,它完全符合您的要求:使用较少的元素每个中的子元素,例如, [1, 0]位于[1, 0, 5]之前。