Python如何根据两个字段进行排序?
写这个博客,就是为了吐槽Python!
对于这个问题,首先,我花了一天时间,没有解决!
当然是百度了,一搜,有很多博客,无一例外,都是垃圾!
有的,只排数组!实体类不考虑了?
有的,只排数字!不排中文?Python中文排序有问题知不知道?!
有的,只排中文!就排了一个字段?
通过百度,倒时很快写出来一个,因为始终不对,折腾一天!- # -*- coding: utf-8 -*-
- from itertools import chain
- from pypinyin import pinyin, Style
- class Student:
- def __init__(self, name, age, height):
- self.name = name
- self.age = age
- self.height = height
- def to_pinyin(stu):
- print "这个print为什么不输出?"
- return ''.join(chain.from_iterable(pinyin(stu.name, style=Style.TONE3)))
- studentList = [
- Student("张三", 25, 190),
- Student("小红", 22, 173),
- Student("小张", 22, 177),
- Student("王五", 25, 187),
- Student("李四", 25, 172),
- Student("小明", 22, 175)
- ]
- studentList.sort(key=lambda x: (-x.age, to_pinyin))
- for student in studentList:
- print str(student.age) + " " + student.name + " " + str(student.height)
复制代码 输出结果:

很显然,这个结果,它不对!
随便用C#写了一个:- List<Student> list = new List<Student>()
- {
- new Student("张三",25),
- new Student("小红",22),
- new Student("小张",22),
- new Student("王五",25),
- new Student("李四",25),
- new Student("小明",22),
- };
- //方法一,虽然写法繁琐,但思路清晰
- list.Sort((a, b) =>
- {
- if (a.Age != b.Age)
- {
- return b.Age - a.Age;
- }
- else
- {
- return string.Compare(a.Name, b.Name);
- }
- });
- //方法二,简捷清晰明了
- //list = list.OrderByDescending(a => a.Age).ThenBy(a => a.Name).ToList();
- foreach (var item in list)
- {
- Console.WriteLine(item.Age + " " + item.Name);
- }
- Console.Read();
- class Student
- {
- public string Name { get; set; }
- public int Age { get; set; }
- public Student(string name, int age)
- {
- Name = name;
- Age = age;
- }
- }
复制代码 输出结果:

结果是正确的。
Python正确的到底怎么写呢?
好吧,被移出博客园首页!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |