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

2022-12-09,,,,

Python3写法

代码

# -*- coding: utf-8 -*-

# 需求:年龄倒序,姓名正序

from itertools import chain
from pypinyin import pinyin, Style class Student:
def __init__(self, name, age):
self.name = name
self.age = age def 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)

输出结果

Python2写法

代码

# -*- coding: utf-8 -*-

# 需求:年龄倒序,姓名正序

from itertools import chain
from pypinyin import pinyin, Style class Student:
def __init__(self, name, age):
self.name = name
self.age = age def 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)

输出结果

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;
}
}

输出结果

对比C#,Python的坑

    Python默认的中文排序得不到预期的结果,需要引用pypinyin库解决,相当麻烦,要看懂这个代码,需要了解迭代器
    Python2的pypinyin库只支持unicode编码的字符串,必须通过decode转码,如果不转码,则抛出错误:must be unicode string or [unicode, ...] list
    Python没有大括号,无法直接在lambda表达式中写方法,方法必须定义在lambda表达式外部
    Python的lambda写法相对难以理解

经验丰富的程序员会说,这还不简单?

但是对于新手来说,非常不人性化,非常浪费时间。

我作为一个Python新手,就写个简单的排序程序,花了很长时间才学会怎么写,当然,确实没有去看文档,只通过百度和在技术群里问,但是没有一个一口答出正确答案,最后自己摸索成功。

有人说Python2忘的差不多了,C#就不会忘。

用到pypinyin库时,还不习惯看pypinyin库的源码,pinyin方法的注释非常详细,不过没有C#这种强类型的语言看起来方便。

Python 根据两个字段排序 中文排序 汉字排序 升序 降序的相关教程结束。

《Python 根据两个字段排序 中文排序 汉字排序 升序 降序.doc》

下载本文的Word格式文档,以方便收藏与打印。