2024-09-25 14:20:10 发布
网友
我有一本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)]
要做到这一点,最不切实际的方法是多了解一些实际的数据——具体来说,就是你可以拥有的最大值——然后这样做:
def sortkey((k, v)): return (maxval - v, k) items = thedict.items() items.sort(key=sortkey)
但是,除非您已经知道最大值,否则搜索最大值意味着在dict中循环一段额外的时间(使用max(thedict.itervalues())),这可能很昂贵。或者,S.Lott解决方案的keyfunc版本:
max(thedict.itervalues())
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
要做到这一点,最不切实际的方法是多了解一些实际的数据——具体来说,就是你可以拥有的最大值——然后这样做:
但是,除非您已经知道最大值,否则搜索最大值意味着在dict中循环一段额外的时间(使用
max(thedict.itervalues())
),这可能很昂贵。或者,S.Lott解决方案的keyfunc版本:另一种不关心类型的方法是比较函数:
这个解决方案实际上适用于任何类型的键和值,您希望在同一个键中混合使用升序和降序排序。如果您重视简洁,那么可以将sortcmp编写为:
你不能分类字典。你必须对项目列表进行排序。
以前的版本是错误的。当您有一个数值时,很容易按相反的顺序排序。这样就行了。但这不是一般的。这只起作用,因为该值是数字。
这里有一个替代方法,使用显式函数代替lambda,使用cmp代替key选项。
更普遍的解决方案实际上是两种不同的类型
相关问题 更多 >
编程相关推荐