python列表中字典指定value的中文按照首字母拼音排序,数字在后
情况说明
排序这种东西,极其常见了,一般的字典排序,列表中字典排序,都很常见。前面也写过了。
今儿遇见一个有趣的,要将列表中字典的中文进行首字母排序。
实验情况
现有一个数据如下:
data = [{'songname': '孤芳自赏','singer': '杨小壮','songid': 7588840,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '红尘情歌','singer': '高安,黑鸭子','songid': 7423524,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '成都-歌手(HD)','singer': '赵雷','songid': 7545063,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': 'a过火','singer': '张信哲','songid': 7000948,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': 'A男孩-歌手(HD)','singer': '梁博','songid': 7548187,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '3我的好兄弟','singer': '小沈阳,高进','songid': 7401487,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '告白气球(HD)','singer': '周杰伦','songid': 7523910,'song_value': 0,'headimg': '','nickname': '','fans_value': 0}]
排序规则:歌曲名称按照首字母排序,数字放在后面。也就是说 中英文歌曲在前,数字歌曲在后
使用一般的sorted
来试试看。
sorted(data, key=lambda x: x.__getitem__(x["songname"]))
结果如下:
[{'songname': '3我的好兄弟','singer': '小沈阳,高进','songid': 7401487,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': 'A男孩-歌手(HD)','singer': '梁博','songid': 7548187,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': 'a过火','singer': '张信哲','songid': 7000948,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '告白气球(HD)','singer': '周杰伦','songid': 7523910,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '孤芳自赏','singer': '杨小壮','songid': 7588840,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '成都-歌手(HD)','singer': '赵雷','songid': 7545063,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '红尘情歌','singer': '高安,黑鸭子','songid': 7423524,'song_value': 0,'headimg': '','nickname': '','fans_value': 0}]
由上可见,字母歌曲虽然对了,但是中文完全不是一回事,成都(chengdu) 在 孤芳自赏(gufangzishang)后面。数字在前面。
与我们的要求大相径庭。
为什么会出现这种情况
本小节内容来自此
Python比较字符串大小时,根据的是ord函数得到的编码值。基于它的排序函数sort可以很容易为数字和英文字母排序,因为它们在编码表中就是顺序排列的。
>> print ','< '1'<'A'<'a'<'阿'
True
但要很处理中文就没那么容易了。中文通常有拼音和笔画两种排序方式,在最常用中文标准字符集GB2312中,3755个一级中文汉字是按照拼音序进行编码的,而3008个二级汉字则是按部首笔画排列,
>> print '曙'< '鲑','曾'<'怡'
True True
出现这样的结果是因为‘曙’和‘曾’都是常用字,而‘鲑’和‘怡’都是次常用字,但无论从笔画还是拼音来看,这两对顺序都应该反过来。后来扩充的GBK和GB18030编码为了向下兼容,都没有更改之前的汉字顺序,于是sort之后的次序就很乱了。
另一方面unicode编码的中文是按《康熙字典》的偏旁部首和笔画数来排列的,所以排序结果和GB编码又不一样。
# encoding=utf8
char=['赵','钱','孙','李','佘']
char.sort()
for item in char:print item.decode('utf-8').encode('gb2312')
输出是:“佘孙李赵钱”;而保存成gb2312编码后
# encoding=gb2312
char=['赵','钱','孙','李','佘']
char.sort()
for item in char:print item
输出是:“李钱孙赵佘”。显然,这两个结果都不是我们想要的。那我们究竟怎样才能对中文正确排序呢?
先要弄清楚中文词典的排序规则:先按拼音排列,区分四声,拼音相同的就看笔画数目多少,笔画数也相同的再按笔顺中的具体笔划类型来区分,新华字典采用的顺序是一丨丿丶乙,也称作“天上人间”,应该没有笔划类型也完全一样的。所以中文排序不仅需要带音调的汉字拼音对照表,还需要有具体笔顺的数据。
此需求的解决办法
我的解决方法就是:按照中文转拼音的方式进行排序,然后切片重新拼接。
首先要获得中文转拼音的方式,我相信绝对有人遇到过这种问题,说不定连包都写好了。
果然有。
首先,下载包pypinyin
.
pip install pypinyin
使用方式,及其完整代码如下:
from pypinyin import lazy_pinyindata = [{'songname': '孤芳自赏','singer': '杨小壮','songid': 7588840,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '红尘情歌','singer': '高安,黑鸭子','songid': 7423524,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '成都-歌手(HD)','singer': '赵雷','songid': 7545063,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': 'a过火','singer': '张信哲','songid': 7000948,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': 'A男孩-歌手(HD)','singer': '梁博','songid': 7548187,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '3我的好兄弟','singer': '小沈阳,高进','songid': 7401487,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '告白气球(HD)','singer': '周杰伦','songid': 7523910,'song_value': 0,'headimg': '','nickname': '','fans_value': 0}]# 排序转换函数
def my_sort(data):res = sorted(data, key=lambda i:lazy_pinyin(i["songname"]))for i in res:m = re.match(r"\D", i["songname"])if m:_ = res.index(i)return res[_:] + res[:_]my_sort(data) # 调用函数
结果如下:
[{'songname': 'A男孩-歌手(HD)','singer': '梁博','songid': 7548187,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': 'a过火','singer': '张信哲','songid': 7000948,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '成都-歌手(HD)','singer': '赵雷','songid': 7545063,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '告白气球(HD)','singer': '周杰伦','songid': 7523910,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '孤芳自赏','singer': '杨小壮','songid': 7588840,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '红尘情歌','singer': '高安,黑鸭子','songid': 7423524,'song_value': 0,'headimg': '','nickname': '','fans_value': 0},{'songname': '3我的好兄弟','singer': '小沈阳,高进','songid': 7401487,'song_value': 0,'headimg': '','nickname': '','fans_value': 0}]
由此即可得到我们想要的结果。
python列表中字典指定value的中文按照首字母拼音排序,数字在后相关推荐
- python列表中字典排序_python中字典排序,列表中的字典排序
python中字典排序,列表中的字典排序 一.使用python模块:operator import operator #首先要导入模块operator x = {1:2, 3:4, 4:3, 2:1, ...
- js 中文转为首字母拼音
1)一个是将汉字翻译为拼音,其中每一个字的首字母大写: pinyin.getFullChars(this.value); 2)一个是可以将每一个字的拼音的首字母提取出来,是大写的形式. pinyi ...
- java对中文首字母拼音排序
Java本身并没有提供汉字拼音排序的功能.但是,我们可以使用第三方库或者自己实现算法来解决这个问题. 下面是使用开源库"Pinyin4j"实现汉字拼音排序的示例代码: ``` im ...
- python 字典的值是列表_python实现求和python如何通过列表中字典的值对列表进行排序...
一. 按字典值排序(默认为升序) x = {1:2, 3:4, 4:3, 2:1, 0:0} 1. sorted_x = sorted(x.iteritems(), key=operator.item ...
- python 删除列表中的指定元素
python 删除列表中的指定元素 def delete_list(list1,ele):"""删除列表中的指定元素:param list1:原列表:param ele: ...
- Python——列表中存放字典遇到的问题
Python--列表中存放字典遇到的问题 使用列表.字典之间的相互嵌套可以很容易的实现json数据格式,但是昨天在往列表中装入字典时遇到了问题: 直接使用append方法将字典添加到列表中,如果需要更 ...
- Python编程对列表中字典元素进行排序的方法详解
@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本文实例讲述了Python编程对列表中字典元素进行排序的方法.分享给大家供大家参考,具体如下: 内容目录: 问题起源 对列表中的字 ...
- python列表、字典、元组的用法及区别_python列表,字典,元组简单用法示例
本文实例讲述了python列表,字典,元组简单用法.分享给大家供大家参考,具体如下: 列表 #_*_ coding:utf-8 _*_ # 列表,定义在方括号的形式中,可以进行切片操作. #它没有固定 ...
- python列表元组字典集合实验心得_python学习小总结(列表、元组、字典、集合、字符串)...
---恢复内容开始--- 一.列表(list) 1.添加 append():追加,在列表末尾添加元素. 列表名.append(添加的元素) extend():扩展,在列表末尾添加元素. 列表名.ext ...
- 1.3 Python列表、字典、集合和JSON四种数据类型
Applications of Deep Neural Networks with Keras 基于Keras的深度神经网络应用 著:Jeff Heaton 译:人工智能学术前沿 目录 1.Pytho ...
最新文章
- 脑机接口主流算法解析课程视频汇总
- windows server 2008 r2 enterprise ,惠普DL 580 G7服务器报,事件 ID: 47错误。
- Oracle中用户解锁
- c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引
- python单向循环链表_python实现单向循环链表 -- 详细思路分析
- ajax请求数据之后在已经有的数据前面打对勾的方法
- JAVA发送邮件(163邮箱发送)
- Windows远程桌面连接Ubuntu 16.04
- 天梯L2-029 特立独行的幸福
- ModBus(RTU TCP UDP通信)及利用socket通信(DTU)实现Modbus-RTU通信协议
- 买社保有哪些好处?社保好还是商业保险好?社保和商业保险的区别?
- SQLMap用户常用命令——1
- css3动画实现3d旋转效果
- 使用python获取美股行情数据
- 计算机网络——Physical_Layer
- 灰度拉伸python,Python OpenCV实例:图像灰度拉伸
- C语言的静态库与共享库
- jodd忽略ssl证书_2.使用jodd 操作mysql数据库
- python 西门子触摸屏通讯_实例讲解博途编程实现S7300与西门子触摸屏通讯
- 【英语】新走遍美国总结