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程序員會說,這還不簡單?
但是對於新手來說,非常不人性化,非常浪費時間。
我作爲一個Python新手,就寫個簡單的排序程序,花了很長時間才學會怎麼寫,當然,確實沒有去看文檔,只通過百度以及在技術羣裏問,但是沒有一個一口答出正確答案,最後自己摸索成功。
有人說Python2忘的差不多了,C#就不會忘。
用到pypinyin庫時,還不習慣看pypinyin庫的源碼,pinyin方法的註釋非常詳細,不過沒有C#這種強類型的語言看起來方便。
對比C#,Python的代碼確實相對簡捷。