我正在尝试对列表列表进行排序,但内部列表的长度不同。例如:
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]]
非常感谢任何帮助或建议。
答案 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]
之前。