2010-11-27 36 views
2

说我有一个字典:d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5}Python按特定定义的规则排序项目

如果我想写一个函数,如果我将该函数传递给内置的排序函数,例如。列表(d).sort(函数)时,排序函数将根据值对任何具有相同值的列表进行排序,并按键(按字母顺序排序)。因此,在这种情况下,d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5,'TAM':0}返回['amy' , 'ABC', 'ABC', '杰克', '谭', '汤姆'] 函数应该是这个样子:

def arrange_items(something, thing,**may be a function**): 
     if something < thing: 
       return -1 
     elif something > thing: 
       return 1 
     etc 

如果我叫some_list.sort(arrange_items),我应该得到排序列表回

预先感谢您

修改规范(另一个问题)的: 如果我有Twitter用户名的字典,字典的在这种格式:

dict = {'JohnZ':{'name': Jonny Zue,'follow':'MiniT',}, etc} # JohnZ is one of the twitter user. The follow means people that JonhZ follows, in this case it is MiniT. 

流行的用户的装置的跟随该特定用户,在上述例子中,MINIT的普及是至少一种B的人数/ c中至少有一个用户谁遵循MiniT。

说我有一个twitter用户名称列表,比如说L1 = ['JonhZ','MiniT'等],我想根据用户的流行度来排序L1(更高的流行度第一)。 dict已经在全局命名空间中定义了(我们可以直接访问dict)。这种排序功能的要求是使用L1.sort(pass_function) 我应该如何编写pass_function以便排序会根据流行度自动排序L1的用户。

感谢您的帮助

回答

2
[k for k, v in sorted(d.iteritems(), key=lambda x: (-x[1], x[0].lower()))] 

编辑:

(我拒绝使用名为 “字典”,因为它隐藏了内置的,和阴影建宏是愚蠢的)

L1.sort(key=lambda x: (-d.get(x, 0), x.lower())) 
+0

说什么是“愚蠢”是没有帮助的。对于译员和未来的编码人员来说,内置插件可能是危险和麻烦的。但不是“愚蠢的” – franklin 2013-07-06 19:18:10

0

你不能用list(d).sort(function)来实现,因为你会得到一个带有字典键的列表。您可以通过其他方法实现您的目标:

l1 = sorted(d.items(), key=lambda x: (x[1], x[0])) 
l2 = sorted(l1, key=lambda x: x[1], reverse=True) 
result = [x[0] for x in l2] 

此方法将字典转换为(键,值)元组列表。然后l1按值排序,l2按键排序。由于python具有稳定的排序算法,因此值的顺序将保留为相同的键。

编辑:Ignacio Vazquez-Abrar的方法类似,但更优雅,因为列表只需要排序一次。