Python 根据两个字段排序 中文排序 汉字排序 升序 降序

Python3写法代码# -*- coding: utf-8 -*-# 需求:年龄倒序,姓名正序from itertools import chainfrom pypinyin import pinyin, Styleclass Student:def __init__(self, name, age):self.name = nameself.age = agedef to_pinyin(stu):lst = pinyin(stu.name, style=Style.TONE3)# 例:[['zhang1'], ['san1']]print(lst)iterator = chain.from_iterable(lst)# 迭代器iterator_for_print = chain.from_iterable(lst)# 迭代器print(iterator_for_print)for item in iterator_for_print:print(item)# 写法一return ''.join(iterator)# 写法二# return ''.join(chain.from_iterable(pinyin(stu.name, style=Style.TONE3)))studentList = [Student("张三", 25),Student("小红", 22),Student("王五", 25),Student("小张", 22),Student("李四", 25),Student("小明", 22)]# 写法一# studentList.sort(key=lambda stu: pinyin(stu.name, style=Style.TONE3))# 写法二studentList.sort(key=lambda stu: to_pinyin(stu))studentList.sort(key=lambda stu: stu.age, reverse=True)print("排序结果:")for student in studentList:print(str(student.age) + " " + student.name)输出结果【Python 根据两个字段排序 中文排序 汉字排序 升序 降序】

Python 根据两个字段排序 中文排序 汉字排序 升序 降序

文章插图
Python2写法代码# -*- coding: utf-8 -*-# 需求:年龄倒序,姓名正序from itertools import chainfrom pypinyin import pinyin, Styleclass Student:def __init__(self, name, age):self.name = nameself.age = agedef to_pinyin(stu):lst = pinyin(stu.name.decode("utf-8"), style=Style.TONE3)# 例:[['zhang1'], ['san1']]print(lst)iterator = chain.from_iterable(lst)# 迭代器iterator_for_print = chain.from_iterable(lst)# 迭代器print(iterator_for_print)for item in iterator_for_print:print(item)# 写法一return ''.join(iterator)# 写法二# return ''.join(chain.from_iterable(pinyin(stu.name.decode("utf-8"), style=Style.TONE3)))studentList = [Student("张三", 25),Student("小红", 22),Student("王五", 25),Student("小张", 22),Student("李四", 25),Student("小明", 22)]# 写法一# studentList.sort(key=lambda stu: pinyin(stu.name.decode("utf-8"), style=Style.TONE3))# 写法二studentList.sort(key=lambda stu: to_pinyin(stu))studentList.sort(key=lambda stu: stu.age, reverse=True)print("排序结果:")for student in studentList:print(str(student.age) + " " + student.name)输出结果
Python 根据两个字段排序 中文排序 汉字排序 升序 降序

文章插图
C#的示例代码List<Student> list = new List<Student>(){new Student("张三", 25),new Student("小红", 22),new Student("王五", 25),new Student("小张", 22),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 根据两个字段排序 中文排序 汉字排序 升序 降序

文章插图
对比C#,Python的坑
  1. Python默认的中文排序得不到预期的结果,需要引用pypinyin库解决,相当麻烦,要看懂这个代码,需要了解迭代器
  2. Python2的pypinyin库只支持unicode编码的字符串,必须通过decode转码,如果不转码,则抛出错误:must be unicode string or [unicode, ...] list
  3. Python没有大括号,无法直接在lambda表达式中写方法,方法必须定义在lambda表达式外部
  4. Python的lambda写法相对难以理解
经验丰富的程序员会说,这还不简单?但是对于新手来说,非常不人性化,非常浪费时间 。我作为一个Python新手 , 就写个简单的排序程序,花了很长时间才学会怎么写 , 当然,确实没有去看文档,只通过百度和在技术群里问,但是没有一个一口答出正确答案 , 最后自己摸索成功 。有人说Python2忘的差不多了,C#就不会忘 。用到pypinyin库时,还不习惯看pypinyin库的源码,pinyin方法的注释非常详细,不过没有C#这种强类型的语言看起来方便 。

    推荐阅读