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
[liangdong@bb-browser-test00.vm.baidu.com py_project]$ python3 main.py
[('a|565|+', 1), ('a|890|+', 2), ('b|232|+', 3), ('b|657|+', 4)]
[liangdong@bb-browser-test00.vm.baidu.com py_project]$ cat main.py
#python3.2
#coding=utf8
import functools
to_sort = {
'a|565|+': 1,
'a|890|+': 2,
'b|232|+': 3,
'b|657|+': 4,
}
def compare_key(left, right):
lfield = left[0].split('|')
rfield = right[0].split('|')
if lfield[0] < rfield[0]:
return -1
elif lfield[0] > rfield[0]:
return 1
else:
nleft = int(lfield[1])
nright = int(rfield[1])
return nleft - nright
to_sort_iter = iter(to_sort.items())
after_sort = list(sorted(to_sort_iter, key = functools.cmp_to_key(compare_key)))
print(after_sort)
复制代码
作者:
masylichu
时间:
2012-09-11 22:21
谢谢你。
从你这里,我又写了一个新的函数。
def cmp_custom_key(a,b):
'''define a new comparison manner between a and b. '''
left = a.split("|")
right = b.split("|")
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