用特定规则对Python中的项目排序
假设我有一个字典:d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5}
如果我想写一个函数,让这个函数可以传给内置的排序函数,比如说 list(d).sort(function),这个排序函数会根据字典中的值来排序。如果有相同的值,就按键的字母顺序来排序。那么在这个例子中,d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5,'TAM':0} 返回的结果应该是 ['amy','Abc','abc','Jack','TAM','Tom']。这个函数大概应该长这样:
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),我应该能得到一个排序好的列表
谢谢你们的帮助
修改说明(另一个问题): 如果我有一个关于推特用户名字的字典,字典的格式是这样的:
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的受欢迎程度至少是1,因为至少有一个用户关注MiniT。
假设我有一个推特用户名的列表,比如 L1 = ['JonhZ','MiniT',等等),我想根据用户的受欢迎程度来排序 L1(受欢迎程度高的排在前面)。字典已经在全局命名空间中定义(我们可以直接访问字典)。这个排序函数的要求是使用 L1.sort(pass_function) 我应该如何写这个 pass_function,让排序能够自动根据用户的受欢迎程度来排序 L1。
谢谢你的帮助
2 个回答
你不能通过 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 的方法类似,但更优雅,因为只需要对列表排序一次。
[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()))
编辑:
(我不想用“dict”这个名字,因为它和一个内置的名字重复了,重复内置名字是很愚蠢的)