用特定规则对Python中的项目排序

4 投票
2 回答
3543 浏览
提问于 2025-04-16 07:41

假设我有一个字典: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 个回答

1

你不能通过 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 的方法类似,但更优雅,因为只需要对列表排序一次。

3
[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”这个名字,因为它和一个内置的名字重复了,重复内置名字是很愚蠢的)

撰写回答