Python2.5字典2键

2024-09-25 14:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本20万条的字典(键是字符串,值是整数)。

打印按降序值然后按升序键(即2键排序)排序的项的最佳/最Python式方法是什么?

 a={ 'keyC':1, 'keyB':2, 'keyA':1 }
b = a.items()
b.sort( key=lambda a:a[0])
b.sort( key=lambda a:a[1], reverse=True )
print b
>>>[('keyB', 2), ('keyA', 1), ('keyC', 1)]

Tags: 方法lambdakey字符串字典排序items整数
3条回答

要做到这一点,最不切实际的方法是多了解一些实际的数据——具体来说,就是你可以拥有的最大值——然后这样做:

def sortkey((k, v)): 
    return (maxval - v, k)

items = thedict.items()
items.sort(key=sortkey)

但是,除非您已经知道最大值,否则搜索最大值意味着在dict中循环一段额外的时间(使用max(thedict.itervalues())),这可能很昂贵。或者,S.Lott解决方案的keyfunc版本:

def sortkey((k, v)): 
    return (-v, k)

items = thedict.items()
items.sort(key=sortkey)

另一种不关心类型的方法是比较函数:

def sortcmp((ak, av), (bk, bv)):
    # compare values 'in reverse'  
    r = cmp(bv, av)
    if not r:
        # and then keys normally
        r = cmp(ak, bk)
    return r

items = thedict.items()
items.sort(cmp=sortcmp) 

这个解决方案实际上适用于任何类型的键和值,您希望在同一个键中混合使用升序和降序排序。如果您重视简洁,那么可以将sortcmp编写为:

def sortcmp((ak, av), (bk, bv)):
    return cmp((bk, av), (ak, bv))

你不能分类字典。你必须对项目列表进行排序。

以前的版本是错误的。当您有一个数值时,很容易按相反的顺序排序。这样就行了。但这不是一般的。这只起作用,因为该值是数字。

a = { 'key':1, 'another':2, 'key2':1 }

b= a.items()
b.sort( key=lambda a:(-a[1],a[0]) )
print b

这里有一个替代方法,使用显式函数代替lambda,使用cmp代替key选项。

def valueKeyCmp( a, b ):
    return cmp( (-a[1], a[0]), (-b[1], b[0] ) )

b.sort( cmp= valueKeyCmp )
print b

更普遍的解决方案实际上是两种不同的类型

b.sort( key=lambda a:a[1], reverse=True )
b.sort( key=lambda a:a[0] )
print b
data = { 'keyC':1, 'keyB':2, 'keyA':1 }

for key, value in sorted(data.items(), key=lambda x: (-1*x[1], x[0])):
    print key, value

相关问题 更多 >