Python中如何按数字降序排序含字符串与数字的列表
电影列表按数字降序排序的正确解决方案
问题说明
现有如下电影列表,每个元素格式为电影名\t数字\n(部分元素无换行),要求不修改列表元素,按元素中的数字从高到低排序:
myliste = ['Bullet train\t5018\n', 'Prey\t508\n', 'Treize vies\t1978\n', 'L’année du requin\t4398\n', 'Carter\t5004\n', 'Night Raiders\t1312\n', 'En décalage\t1789\n', 'The Bikeriders\t2134\n', 'Darling\t2008\n', 'Alina of Cuba\t678\n', 'Amants Super-héroïques\t837\n', 'Ménestrel\t3065\n', 'Des feux dans la nuit\t2144\n', 'Luck\t3148\n', 'Sita Ramam\t4498\n', 'Poikkal Kudhirai\t2248\n', 'Les Promesses d’Hasan\t3598\n', 'Wedding Season\t2490\n', 'Le Destin des Tortues Ninja, le Film\t845\n', 'La Vie en plus grand\t489\n', 'Hero Mode\t245\n', 'Embuscade\t1038\n', 'The Last Son\t1245\n', 'Mission Eagle\t998\n', 'Doblemente Embarazada\t745']
用户尝试的代码无法得到正确结果,错误代码如下:
def sort_films(LF): a = i.index('\t') b = i.index('\n') c = i[a+2:b] return(c) LF.sort(key=sort_films,reverse=True)
错误原因分析
- 变量名错误:函数参数为
LF,但内部使用未定义的变量i,属于逻辑错误 - 数字提取位置错误:
\t是单个字符,数字起始位置应为a+1而非a+2,导致提取的数字缺失第一位 - 排序依据错误:返回字符串类型的数字,字符串排序是字典序(比如
"2490"会被认为比"5018"大),而非数值大小排序
正确解决方案
代码实现
def sort_films(item): # 按制表符分割,取数字所在的部分 num_str = item.split('\t')[1] # 移除换行符并转为整数 return int(num_str.strip('\n')) # 执行降序排序 myliste.sort(key=sort_films, reverse=True)
排序后结果
['Bullet train\t5018\n', 'Carter\t5004\n', 'Sita Ramam\t4498\n', 'L’année du requin\t4398\n', 'Les Promesses d’Hasan\t3598\n', 'Luck\t3148\n', 'Ménestrel\t3065\n', 'Wedding Season\t2490\n', 'Poikkal Kudhirai\t2248\n', 'Des feux dans la nuit\t2144\n', 'The Bikeriders\t2134\n', 'Darling\t2008\n', 'Treize vies\t1978\n', 'En décalage\t1789\n', 'Night Raiders\t1312\n', 'The Last Son\t1245\n', 'Embuscade\t1038\n', 'Mission Eagle\t998\n', 'Le Destin des Tortues Ninja, le Film\t845\n', 'Amants Super-héroïques\t837\n', 'Doblemente Embarazada\t745', 'Alina of Cuba\t678\n', 'Prey\t508\n', 'La Vie en plus grand\t489\n', 'Hero Mode\t245\n']
代码说明
- 用
split('\t')分割字符串,直接获取数字段,避免手动索引的误差 strip('\n')兼容带换行和不带换行的元素- 转为整数后排序,确保按数值大小而非字典序排序
内容的提问来源于stack exchange,提问作者Az7
相关产品推荐
相关产品推荐

