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的代码确实相对简捷。
来源:https://www.cnblogs.com/s0611163/p/16822014.html
本站部分图文来源于网络,如有侵权请联系删除。