免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2477 | 回复: 4
打印 上一主题 下一主题

字典排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-11 10:35 |只看该作者 |倒序浏览
我有一个字典的数据,其中key是 这样的形式 a|565|+   中间是有‘|’ 分割的。 value就是纯粹的str

我想对这个字典的key排序,然后输出,排序要求是是对key的 第一个竖线钱的字母排序,然后是对中间的数字,

比如:
a|565|+
a|890|+
b|232|+
b|657|+
......

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-09-11 13:20 |只看该作者
  1. [liangdong@bb-browser-test00.vm.baidu.com py_project]$ python3 main.py
  2. [('a|565|+', 1), ('a|890|+', 2), ('b|232|+', 3), ('b|657|+', 4)]
  3. [liangdong@bb-browser-test00.vm.baidu.com py_project]$ cat main.py
  4. #python3.2
  5. #coding=utf8

  6. import functools

  7. to_sort = {
  8.         'a|565|+': 1,
  9.         'a|890|+': 2,
  10.         'b|232|+': 3,
  11.         'b|657|+': 4,
  12. }

  13. def compare_key(left, right):
  14.         lfield = left[0].split('|')
  15.         rfield = right[0].split('|')
  16.         if lfield[0] < rfield[0]:
  17.                 return -1
  18.         elif lfield[0] > rfield[0]:
  19.                 return 1
  20.         else:
  21.                 nleft = int(lfield[1])
  22.                 nright = int(rfield[1])
  23.                 return nleft - nright

  24. to_sort_iter = iter(to_sort.items())
  25. after_sort = list(sorted(to_sort_iter, key = functools.cmp_to_key(compare_key)))
  26. print(after_sort)
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-09-11 22:21 |只看该作者
谢谢你。

从你这里,我又写了一个新的函数。
  1. def cmp_custom_key(a,b):
  2.     '''define a new comparison manner between a and b. '''
  3.     left  = a.split("|")
  4.     right = b.split("|")
  5.     return cmp(left[0],right[0]) or cmp( int(left[1]), int(right[1]) )  
复制代码
回复 2# linux_c_py_php


   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2012-09-11 22:53 |只看该作者
额, 你这是python 2.x吧, sorted发生了比较大的变动.

论坛徽章:
0
5 [报告]
发表于 2012-09-11 23:49 |只看该作者
本帖最后由 dreamlearn 于 2012-09-11 23:55 编辑

to_sort = {'a|565|+': 1,'a|890|+': 2,'b|232|+': 3,'b|657|+': 4}
key = list(to_sort)
key.sort()
這様可以嗎???
['a|565|+', 'a|890|+', 'b|232|+', 'b|657|+']
for k in key:
     print(k)

'a|565|+'
'a|890|+'
'b|232|+'
'b|657|+'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP