2013-11-15 51 views
3

我想排序一個字典是形式:高級列表排序的Python

d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124} 

我想關鍵的,這樣它在形式對它進行排序:

+A, A, -A, +B, B, -B, etc 

我一直試圖使用sorted(d, key=lambda x: (x[1], x[0]) if len(x) == 2 else x[0]) ,但我似乎無法找到任何方法來正確排序符號,因爲它們在ascii圖表上的順序不正確。我究竟做錯了什麼?

+1

'排序(d,...)'僅將_keys_傳遞給​​lambda函數。 –

回答

5

這應該工作:

sorted(d, key=lambda x: (x[1], x[0]) if len(x) == 2 else (x[0], ',')) 

ascii value,在於+-之間,所以你可以把一個虛擬,末進行比較。

>>> d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124, '+B':1, 'B':98, '+C':232, 'C':23} 
>>> sorted(d, key=lambda x: (x[1], x[0]) if len(x) == 2 else (x[0], ',')) 
['+A', 'A', '-A', '+B', 'B', '-B', '+C', 'C', '-C'] 

你也可以簡單地逆轉的關鍵,並附加,的比較:

sorted(d, key=lambda x: x[::-1] + ',') 

所以+ A,A,-A被比作A+,AA-,

+0

這非常聰明 – TerryA

+0

這樣做似乎很有效,因爲您的樣本中沒有「+ B」B「+ C」C「! –

+0

@gnibbler好的,我應該把字母順序放在第一位。固定! –

6

一個簡單的方法來做到這一點

rank = ['+A', 'A', '-A', '+B', 'B', '-B', ...] 
sorted(d.items(), key=lambda i: rank.index(i[0])) 

如果有很多行列,這將是更好地使用dict

rank = {'+A': 0, 'A': 1, '-A': 2, '+B': 3, 'B': 4, '-B': 5, ...} 
sorted(d.items(), key=lambda i: rank[i[0]]) 

可以使用lambda函數是這樣的。請注意,使用向後切片以確保字母在其修飾符之前進行排序很重要。

sorted(d.items(), key=lambda i:(','+i[0])[::-1]) 

但我認爲,明確rank更清晰,不容易像在@哈日的答案錯誤。 (5人投了贊成票沒有注意到到目前爲止的bug)

如果你真的只需要關鍵字排序(爲什麼?),你可以簡單地使用rank.get,而不是lambda函數:

>>> rank = {'+A': 0, 'A': 1, '-A': 2, '+B': 3, 'B': 4, '-B': 5, '+C': 6, 'C': 7, '-C': 8} 
>>> d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124} 
>>> sorted(d, key=rank.get) 
['+A', 'A', '-A', '-B', '-C'] 

但它可能會更好跳過sorted

>>> rank = ['+A', 'A', '-A', '+B', 'B', '-B', '+C', 'C', '-C'] 
>>> d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124} 
>>> [k for k in rank if k in d] 
['+A', 'A', '-A', '-B', '-C'] 

如果你不喜歡打字所有這些'

>>> rank = '+A A -A +B B -B +C C -C'.split() 
0

我倒是排序:

  • 就信 - 剝離領先-+
  • 換個重量上+(-1),所以它是第一位的,-所以它的最後一個(1),否則0

例如:

sorted(d.iteritems(), key=lambda L: (L[0].lstrip('-+'), {'-': 1, '+': -1}.get(L[0][0], 0))) 
# [('+A', 234), ('A', 454), ('-A', 124), ('-B', 212), ('-C', 991)] 
+0

你也可以使用'L [0] [ - 1]'而不是'lstrip' –