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

python中基于自定义比较器的字典项排序列表,python,list,sorting,dictionary,tuples,Python,List,Sorting,Dictionary,Tuples,我有一个值字典,我想根据自己定义的比较对其进行排序。我知道你不能给字典分类。以下是重要的代码: 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 因此,这两个

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

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
因此,这两个比较函数接受两个整数的两个元组。它比较两个元组,如果第一个元组较高,则返回true,因此如果使用第二个比较器,则0,4将高于0,3。同样地

cmpFirstVals((4,2),(2,2))
将返回真值

My dict以字符串作为键,两个int元组作为值:

d = {'objA':(1,12),'objB':(13,3)} //etc etc etc
我知道可以对列表中的d项进行排序,我最终会用排序后的列表中的前三项构建一个dict,但我需要使用这些比较器进行排序

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

另外,请注意,如果两个元组具有相同的索引值,则比较器将返回false。ie cmpFirstVals4,2,4,3将返回false

Erm

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中值的完整元组:

>>> sorted(d.items(),key=lambda t: t[1][1])
[('objB', (13, 3)), ('objA', (1, 12))]
>>> sorted(d.items(),key=lambda t: t[1][0])
[('objA', (1, 12)), ('objB', (13, 3))]
根据您的评论进行编辑:

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

print(f(d,lambda t: t[1][0]))  
接受一个函数。所以你可以这样做:

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)) 

专业提示:expr1>expr2通常已经生成一个布尔值。只需返回tup1[0]>tup2[0]就足够了。如果您的自定义类型可能会从_gt_uu和朋友返回其他内容,请使用return booltup1[0]>tup2[0]。不需要if-exr:返回True;else:返回False verbosity。这里唯一的问题是,我需要将这种排序嵌入另一个函数中,该函数使用一个比较器作为参数。我知道使用排序与lambda是一种有效的方法,但这是我被赋予的任务。。。