python中基于自定义比较器的字典项列表排序

2024-10-01 09:18:06 发布

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

我有一个值字典,我想根据自己定义的比较对其进行排序。我知道你不会整理字典。以下是重要代码:

def cmpFirstVals(tup1,tup2):
  if tup1[0] > tup2[0]:
    return True
  else:
    return False
def cmpSecondVals(tup1,tup2):
  if tup1[1] > tup2[1]:
    return True
  else:
    return False

所以这两个比较函数接受两个int的两个元组。它比较两个元组,如果第一个元组更高,则返回true;如果使用第二个比较器,则(0,4)将高于(0,3)。同样

^{pr2}$

会返回True。在

我的dict是用字符串作为键和两个int元组作为值构建的:

d = {'objA':(1,12),'objB':(13,3)} //etc etc etc

我知道可以对list d.items()进行排序,我最终会用排序后的列表中的前三项构造dict,但是我需要使用这些比较器进行排序。在

我需要知道如何通过这些比较器进行排序?在

另外,请注意,如果两个元组的索引值相同,则比较器将返回false。(即cmpFirstVals((4,2),(4,3))将返回false)


Tags: falsetruereturnif字典排序defetc
2条回答

呃。。。在

byfirst = sort(somedict.values(), key=operator.itemgetter(0))
bysecond = sort(somedict.values(), key=operator.itemgetter(1))

二进制比较器在2.x中被弃用,在3.x中被删除

如果希望排序后的列表只包含值元组:

>>> d = {'objA':(1,12),'objB':(13,3)}
>>> sorted(d.values())
[(1, 12), (13, 3)]
>>> sorted(d.values(), key=lambda t: t[1])
[(13, 3), (1, 12)]

如果需要dict中值的完整元组:

^{pr2}$

编辑(根据您的评论):

def f(d,c):
    return sorted(d.items(),key=c) 

print(f(d,lambda t: t[1][0]))  

key接受函数。所以你可以这样做:

def cmpFirstVal(t1):
    return t1[1][0]

def cmpSecondVal(t1):
    return t1[1][1]

def f(d,c):
    return sorted(d.items(),key=c) 

print(f(d,cmpFirstVal)) 
print(f(d,cmpSecondVal)) 

相关问题 更多 >