使用heapq按首元素降序、次元素字典序排序失败问题
解决heapq.nlargest排序不符合预期的问题
你的代码里,heapq.nlargest使用lambda x: (x[0], x[1])作为排序key时,会优先按元组首元素降序,但首元素相同时,会按字符串的字典序降序排列——因为nlargest是选取key值最大的元素,而'iz'的字典序比'i love'大,所以会排在前面,这和你预期的「首元素相同时字符串按字典序升序」相反。
解决方案1:调整key改用heapq.nsmallest
nsmallest选取key值最小的元素,我们可以把key设计为(-x[0], x[1]):
-x[0]越小,对应原x[0]越大,实现首元素降序- 首元素相同时,
x[1]越小(字典序越靠前),key值越小,会被优先选中,实现字符串升序
import heapq ls = [(5, 'i love'), (2, 'island'), (5, 'iz')] res = heapq.nsmallest(3, ls, key=lambda x: (-x[0], x[1])) print(res) # 输出: [(5, 'i love'), (5, 'iz'), (2, 'island')]
解决方案2:用sorted函数直接排序(更直观)
sorted默认按key升序排列,用(-x[0], x[1])作为key可以直接实现首元素降序、字符串升序的需求,之后取前n个元素即可:
ls = [(5, 'i love'), (2, 'island'), (5, 'iz')] res = sorted(ls, key=lambda x: (-x[0], x[1]))[:3] print(res) # 输出: [(5, 'i love'), (5, 'iz'), (2, 'island')]
内容的提问来源于stack exchange,提问作者Kunjan Vaghela
相关产品推荐
相关产品推荐

