2009-11-23 99 views
1
[(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')] 

我想按字母順序排列,按「PRP,VBD,PRP和VBP」 這不是傳統的排序,對嗎?如何在Python中訂購此列表?

回答

15

使用itemgetter:

>>> a = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')] 
>>> import operator 
>>> a.sort(key = operator.itemgetter(1)) 
>>> a 
[(u'.', '.'), (u'we', 'PRP'), (u'you', 'PRP'), (u'saw', 'VBD'), (u'bruh', 'VBP')] 
+3

+ 1使用'itemgetter',不知道它存在:) – abyx 2009-11-23 10:33:20

+0

+1使用鍵而不是cmp。 – SpoonMeiser 2009-11-23 10:55:02

+0

可接受的解決方案...但我不認爲這是值得進口。 :)我更喜歡Dave Webb的方式。 – 2009-11-23 10:57:48

1

您可以在sort方法傳遞一個比較函數。

實施例:

l = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')] 
l.sort(lambda x, y: cmp(x[1], y[1])) # compare tuple's 2nd elements 

輸出:

>>> l 
[(u'.', '.'), 
(u'we', 'PRP'), 
(u'you', 'PRP'), 
(u'saw', 'VBD'), 
(u'bruh', 'VBP')] 
>>> 
+0

使用鍵排序優於使用cmp,因爲鍵只會被調用N次,其中cmp將被稱爲NlogN次。你沒有選擇python3,支持cmp已被刪除 – 2009-11-23 10:49:06

+0

@gnibbler,謝謝你的提示。爲什麼密鑰只會被調用N次?我不知道。 – 2009-11-23 10:59:14

+1

@Nick,因爲使用'key',Python會遍歷列表一次來計算密鑰,然後使用這些密鑰進行排序。另一方面,使用'cmp'時,每次需要比較兩個值時都會調用該函數。 – 2009-11-23 11:10:54

7

sort method需要key參數從每個參數提取對比密鑰,即key是其將列表項入值的函數你想排序。

在這種情況下,它很容易use a lambda提取從每個元組中的第二項:

>>> mylist = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP') 
, (u'.', '.')] 
>>> mylist.sort(key = lambda x: x[1]) 
>>> mylist 
[(u'.', '.'), (u'we', 'PRP'), (u'you', 'PRP'), (u'saw', 'VBD'), (u'bruh', 'VBP')] 
+0

實際上,它與itemgetter相同,但至少你可以看到它在做什麼。 – Natim 2009-11-23 10:51:39

0

或者使用排序的內置功能(類似Nick_D的答案):

ls = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')] 


sorted(ls, cmp=lambda t1, t2: cmp(t1[1], t2[1]))