1

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

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

将返回 True。

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

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

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

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

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

4

2 回答 2

0

嗯...

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

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

于 2013-06-30T21:49:28.813 回答
0

如果您希望排序列表仅包含值元组:

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

如果你想要字典中值的完整元组:

>>> 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)) 
于 2013-06-30T21:55:07.107 回答