情况说明

排序这种东西,极其常见了,一般的字典排序,列表中字典排序,都很常见。前面也写过了。

今儿遇见一个有趣的,要将列表中字典的中文进行首字母排序。

实验情况

现有一个数据如下:

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的中文按照首字母拼音排序,数字在后相关推荐

  1. python列表中字典排序_python中字典排序,列表中的字典排序

    python中字典排序,列表中的字典排序 一.使用python模块:operator import operator #首先要导入模块operator x = {1:2, 3:4, 4:3, 2:1, ...

  2. js 中文转为首字母拼音

    1)一个是将汉字翻译为拼音,其中每一个字的首字母大写:   pinyin.getFullChars(this.value); 2)一个是可以将每一个字的拼音的首字母提取出来,是大写的形式. pinyi ...

  3. java对中文首字母拼音排序

    Java本身并没有提供汉字拼音排序的功能.但是,我们可以使用第三方库或者自己实现算法来解决这个问题. 下面是使用开源库"Pinyin4j"实现汉字拼音排序的示例代码: ``` im ...

  4. python 字典的值是列表_python实现求和python如何通过列表中字典的值对列表进行排序...

    一. 按字典值排序(默认为升序) x = {1:2, 3:4, 4:3, 2:1, 0:0} 1. sorted_x = sorted(x.iteritems(), key=operator.item ...

  5. python 删除列表中的指定元素

    python 删除列表中的指定元素 def delete_list(list1,ele):"""删除列表中的指定元素:param list1:原列表:param ele: ...

  6. Python——列表中存放字典遇到的问题

    Python--列表中存放字典遇到的问题 使用列表.字典之间的相互嵌套可以很容易的实现json数据格式,但是昨天在往列表中装入字典时遇到了问题: 直接使用append方法将字典添加到列表中,如果需要更 ...

  7. Python编程对列表中字典元素进行排序的方法详解

    @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本文实例讲述了Python编程对列表中字典元素进行排序的方法.分享给大家供大家参考,具体如下: 内容目录: 问题起源 对列表中的字 ...

  8. python列表、字典、元组的用法及区别_python列表,字典,元组简单用法示例

    本文实例讲述了python列表,字典,元组简单用法.分享给大家供大家参考,具体如下: 列表 #_*_ coding:utf-8 _*_ # 列表,定义在方括号的形式中,可以进行切片操作. #它没有固定 ...

  9. python列表元组字典集合实验心得_python学习小总结(列表、元组、字典、集合、字符串)...

    ---恢复内容开始--- 一.列表(list) 1.添加 append():追加,在列表末尾添加元素. 列表名.append(添加的元素) extend():扩展,在列表末尾添加元素. 列表名.ext ...

  10. 1.3 Python列表、字典、集合和JSON四种数据类型

    Applications of Deep Neural Networks with Keras 基于Keras的深度神经网络应用 著:Jeff Heaton 译:人工智能学术前沿 目录 1.Pytho ...

最新文章

  1. 脑机接口主流算法解析课程视频汇总
  2. windows server 2008 r2 enterprise ,惠普DL 580 G7服务器报,事件 ID: 47错误。
  3. Oracle中用户解锁
  4. c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引
  5. python单向循环链表_python实现单向循环链表 -- 详细思路分析
  6. ajax请求数据之后在已经有的数据前面打对勾的方法
  7. JAVA发送邮件(163邮箱发送)
  8. Windows远程桌面连接Ubuntu 16.04
  9. 天梯L2-029 特立独行的幸福
  10. ModBus(RTU TCP UDP通信)及利用socket通信(DTU)实现Modbus-RTU通信协议
  11. 买社保有哪些好处?社保好还是商业保险好?社保和商业保险的区别?
  12. SQLMap用户常用命令——1
  13. css3动画实现3d旋转效果
  14. 使用python获取美股行情数据
  15. 计算机网络——Physical_Layer
  16. 灰度拉伸python,Python OpenCV实例:图像灰度拉伸
  17. C语言的静态库与共享库
  18. jodd忽略ssl证书_2.使用jodd 操作mysql数据库
  19. python 西门子触摸屏通讯_实例讲解博途编程实现S7300与西门子触摸屏通讯
  20. 【英语】新走遍美国总结

热门文章

  1. 零基础Python完全自学教程:1.认识python
  2. 十分钟了解Http(1)——HTTP的报文到底是什么?
  3. Android edittext 属性inputtype
  4. 边缘检测之Sobel算子Prewitt算子
  5. RC低通滤波器——CR高通滤波器---的使用
  6. Java实习日记(7)
  7. Abp vNext swagger注释
  8. Excel-箱线图(数据分布)分析
  9. labview温度采集系统,温度计正负范围内显示,附加温度预警操作部分(初学者~)
  10. 萌新的51之旅——红外通信