Python列表先按字段0再按字段1排序未达预期问题咨询
问题分析与解决
你的排序逻辑确实有问题——第二次调用sorted时是对整个列表按第二个元素排序,自然会把Germany的条目打乱位置。要实现「Germany保持顶部,仅对Japan条目按第二个字段排序」的需求,有两种简单的实现方式:
方法一:拆分列表后合并
直接把Germany和Japan的条目分开处理,排序Japan部分后再合并:
from operator import itemgetter data = [['Japan',0],['Japan',36],['Japan',21],['Germany',7]] # 拆分出Germany和Japan的条目 germany_entries = [item for item in data if item[0] == 'Germany'] # 对Japan条目按第二个元素排序 japan_entries = sorted([item for item in data if item[0] == 'Japan'], key=itemgetter(1)) # 合并结果,Germany保持在最前 result = germany_entries + japan_entries for line in data: print(line) print('---') for line in result: print(line)
运行结果会符合预期:
['Japan', 0] ['Japan', 36] ['Japan', 21] ['Germany', 7] --- ['Germany', 7] ['Japan', 0] ['Japan', 21] ['Japan', 36]
方法二:使用复合排序key
通过一次sorted调用实现,用复合key控制排序优先级:先判断是否为Germany(是的话排在最前),再按国家名称,最后按第二个元素:
from operator import itemgetter data = [['Japan',0],['Japan',36],['Japan',21],['Germany',7]] # 复合key:第一个元素是布尔值(False比True小,所以Germany条目排前面),然后是国家名、第二个数字 result = sorted(data, key=lambda x: (x[0] != 'Germany', x[0], x[1])) for line in data: print(line) print('---') for line in result: print(line)
这个方法更灵活,如果后续有更多国家,也能保证Germany始终在最前,其他国家按名称排序,同一国家内按第二个数字排序。
为什么原代码不符合预期?
原代码中第二次调用sorted(sort1, key=itemgetter(1))是对整个列表的第二个元素进行排序,完全忽略了第一个元素的分组逻辑。所以Germany的条目因为第二个元素是7,会被排在第二个元素为0的Japan条目之后,导致位置错乱。
内容的提问来源于stack exchange,提问作者troppapolvere
相关产品推荐
相关产品推荐

