Python按特定的规则排序项目

时间:2010-11-27 21:24:02

标签: python list sorting dictionary

说我有一个字典:d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5}

如果我想编写一个函数,如果我将该函数传递给内置排序函数,例如。 list(d).sort(function),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),我应该得到一个排序列表

提前谢谢

规范修改(另一个问题): 如果我有推特用户名的字典,则dict采用以下格式:

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。

说我有一个推特用户名列表,比如L1 = ['JonhZ','MiniT'等],我想根据用户的受欢迎程度对L1进行排序(更高的受欢迎程度排在第一位)。 dict已在全局命名空间中定义(我们可以直接访问dict)。此排序函数的要求是使用L1.sort(pass_function) 我应该如何编写pass_function,以便sort会根据用户的受欢迎程度自动对L1进行排序。

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

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

修改

(我拒绝使用名称“dict”,因为它会影响内置,而阴影内置是愚蠢的)

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

答案 1 :(得分: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的方法类似,但更优雅,因为列表只需要排序一次。