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

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的坑

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

经验丰富的Python程序员会说,这还不简单?
但是对于新手来说,非常不人性化,非常浪费时间。
我作为一个Python新手,就写个简单的排序程序,花了很长时间才学会怎么写,当然,确实没有去看文档,只通过百度以及在技术群里问,但是没有一个一口答出正确答案,最后自己摸索成功。
有人说Python2忘的差不多了,C#就不会忘。
用到pypinyin库时,还不习惯看pypinyin库的源码,pinyin方法的注释非常详细,不过没有C#这种强类型的语言看起来方便。
对比C#,Python的代码确实相对简捷。

posted @ 2022-10-24 18:12  0611163  阅读(802)  评论(0编辑  收藏  举报