Chinaunix

标题: 字典排序 [打印本页]

作者: masylichu    时间: 2012-09-11 10:35
标题: 字典排序
我有一个字典的数据,其中key是 这样的形式 a|565|+   中间是有‘|’ 分割的。 value就是纯粹的str

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

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


作者: linux_c_py_php    时间: 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)
复制代码

作者: masylichu    时间: 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


   
作者: linux_c_py_php    时间: 2012-09-11 22:53
额, 你这是python 2.x吧, sorted发生了比较大的变动.
作者: dreamlearn    时间: 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|+'




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2