2013-06-30 74 views
1

我有一個我想根據自己定義的比較進行排序的值字典。我知道你不能對字典進行排序。這裏是重要的代碼:根據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)。同樣,

cmpFirstVals((4,2),(2,2)) 

會返回True。

我的字典是建立與字符串作爲鍵和兩個-INT元組的值:

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

我知道這是可能的列表d.items()排序,我最終將構建一個字典與排序列表中的前三個項目,但我需要使用這些比較器進行排序。

我需要知道如何通過這些比較器進行排序?

另外,請注意,如果兩個元組具有相同的索引值,比較器將返回false。 (即cmpFirstVals((4,2),(4,3))將返回FALSE)

+1

專家提示:'expr1> expr2' *通常*已經產生一個布爾值。只需'返回tup1 [0]> tup2 [0]'就足夠了。如果自定義類型可能會從'__gt__'和朋友中返回其他內容,則使用'return bool(tup1 [0]> tup2 [0])'。不需要'如果exr:return True;否則:返回False冗長。 –

回答

0

呃......

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

二進制比較被棄用2.x和3.X中刪除。

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

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

這裏唯一的問題是我需要將這種類型嵌入到另一個將其中一個比較器作爲參數的函數中。我知道在lambda中使用sorted()是有效的方式,但這是我得到的任務... – maurelius24

相關問題