如何为二维列表按多索引排序并为不存在的索引设置默认值?
解决二维列表多条件排序时的索引越界问题
你遇到的问题是因为部分子列表长度不足,访问不存在的索引导致报错。可以通过两种简单方式给缺失的索引设置默认值,避免报错同时实现排序需求:
方法一:判断子列表长度后取值
直接在lambda表达式里判断子列表是否包含目标索引,不包含就用默认值替代:
my_list = [[5, 4], [1], [6, 8, 1]] # 这里给x[1]设置默认值0,可根据需求换成None、无穷大(float('inf'))等 my_list.sort(key=lambda x: (x[0], x[1] if len(x) > 1 else 0))
执行后my_list会变成[[1], [5, 4], [6, 8, 1]]——因为[1]的第二个元素用了默认值0,比[5,4]的4小,所以排在前面。
方法二:补全子列表后取前N个元素
如果需要按多个索引排序,这种方式更简洁:预先给子列表补全足够的默认值,再取需要的前N个元素作为排序key:
my_list = [[5, 4], [1], [6, 8, 1]] # 补2个默认值0,取前2个元素作为排序条件 my_list.sort(key=lambda x: (x + [0]*2)[:2])
效果和方法一完全一致。如果要扩展到3个排序条件(x[0],x[1],x[2]),只需把[0]*2改成[0]*3,[:2]改成[:3]即可。
注意
默认值的选择会直接影响排序结果:比如把默认值设为float('inf')(无穷大),[1]的第二个元素会被视为最大的数,排序后会排在最后,结果变为[[5, 4], [6, 8, 1], [1]],可以根据实际需求调整默认值。
内容的提问来源于stack exchange,提问作者YangTegap
相关产品推荐
相关产品推荐

