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的坑
- 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 根据两个字段排序 中文排序 汉字排序 升序 降序的更多相关文章
- C# List.sort排序详解(多权重,升序降序)
很多人可能喜欢Linq的orderBy排序,可惜U3D里面linq在Ios上会报错,所以就必须使用list的排序. 其实理解了并不难 升序降序比较 sort有三种结果 1,-1,0分别是大,小,相等. ...
- mysql字段有中英文,数字按照升序/降序 排序
ORDER BY CONVERT(name,SIGNED) ASC, CONVERT(name USING gbk) DESC
- 【java】实体类中 按照特定的字段 进行升序/降序 排序
背景: 实际页面上 所有的分值都是按照JSON格式存储在一个字符串中 存储在同一个字段中: {"ownPTotal":"10>0","ownO ...
- TreeMap升序|降序排列和按照value进行排序
TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public st ...
- C# List.sort排序(多权重,升序降序)
很多人可能喜欢Linq的orderBy排序,可惜U3D里面linq在Ios上会报错,所以就必须使用list的排序. 其实理解了并不难 升序降序比较 sort有三种结果 1,-1,0分别是大,小,相等. ...
- HTML中实现Table表头点击升序/降序排序
题目:如下图,请实现表格信息的排序功能,当点击表头的属性区域,将表格信息进行排序切换功能,即第一次点击为降序排序,再一次点击进行升序排序. 姓名 力量 敏捷 智力 德鲁伊王 17 24 13 月之骑士 ...
- python 根据两个字段排序, 一个升序, 一个降序
from collections import Counter c = Counter(input()) l=sorted(c.items(), key=lambda s:(-s[], s[])) ] ...
- Java Collection.sort 排序升序, 降序问题
不多说,记住2点, 直接上代码(下面是降序): package mall; import java.util.ArrayList; import java.util.Collections; impo ...
- 010.Oracle数据库 , ORDER BY 按升序降序排序
/*Oracle数据库查询日期在两者之间*/ SELECT DISTINCT ATA FROM LM_FAULT WHERE ( OCCUR_DATE BETWEEN to_date( '2017-0 ...
随机推荐
- 微服务性能分析|Pyroscope 在 Rainbond 上的实践分享
随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈.CPU利用率高.或内存泄漏等问题.要找到问题的根本原因,我们通常都会通过日志.进程再结合代码去判断根 ...
- dotnet 设计规范 · 数组定义
✓ 建议在公开的 API 使用集合而不是数组.集合可以提供更多的信息. X 不建议设置数组类型的字段为只读.虽然用户不能修改字段,但是可以修改字段里面的元素.如果需要一个只读的集合,建议定义为只读集合 ...
- spark 读取Geomesa(Hbase)数据
package com.grady.geomesa import org.apache.hadoop.conf.Configuration import org.apache.spark.SparkC ...
- winfrom,窗体抖动功能
#region 方法一 Point first = this.Location; for (int i = 0; i < 50; i++) { Application.DoEvents(); R ...
- Windows LDAP加固之LDAP签名
微软计划于2020年1月推出补丁更新,启用LDAP签名.虽然目前版本的操作系统已经包含了这个功能,但是微软并没有将它启用.随着时间推移,网络上的威胁越来越多.凭据重放和中间人攻击在LDAP的攻击中显得 ...
- 3.云原生之Docker容器三大核心概念介绍
转载自:https://www.bilibili.com/read/cv15181760/?from=readlist docker search --no-trunc=false [镜像名称] #搜 ...
- Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群
文章转载自:https://i4t.com/5451.html 背景 Kubernetes 1.24新特性 从kubelet中移除dockershim,自1.20版本被弃用之后,dockershim组 ...
- 通过 Docker 部署 Mysql 8.0 主从模式
文章转载自:http://www.mydlq.club/article/106/ 系统环境: Mysql 版本:8.0.23 Docker 版本:19.03.13 一.为什么需要 Mysql 主从复制 ...
- 11. 第十篇 网络组件flanneld安装及使用
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483834&idx=1&sn=b04ec193 ...
- 使用ingress-nginx
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247496824&idx=1&sn=cd845d77 ...