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的代碼確實相對簡捷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章