2009-01-26 86 views
70

給定一個字符串列表,我想按字母順序排序並刪除重複項。我知道我可以這樣做:如何從Python列表中刪除重複項並保持順序?

from sets import Set 
[...] 
myHash = Set(myList) 

但我不知道如何從哈希按字母順序檢索列表成員。

我沒有結婚的散列,所以任何方式來完成此工作。此外,性能不是問題,所以我更願意將代碼中明確表達的解決方案更快速但更不透明的解決方案。

+0

另請參閱[此處](http://stackoverflow.com/q/7961363/1129682)以獲取更多信息 – user1129682 2014-03-14 17:37:49

回答

176

列表可以被排序和去重複使用內置的功能:

myList = sorted(set(myList)) 
  • set是用於Python一個內置函數> = 2.3
  • sorted是用於Python一個內置函數> = 2.4
+5

表現力與簡潔性完美融合。謝謝,羅德! – 2009-01-26 15:01:09

+10

如果您的myList具有不可用的對象,則這不起作用。 – 2012-11-14 11:30:04

+0

不會設置(排序(myList))更快?我的意思是,首先對列表進行排序並刪除其重複項比首先刪除重複項並僅在事後進行排序不是更快? – 2017-01-26 19:27:35

2

如果它的清晰度你之後,而不是速度,我覺得這是很清楚的:

def sortAndUniq(input): 
    output = [] 
    for x in input: 
    if x not in output: 
     output.append(x) 
    output.sort() 
    return output 

雖然它是O(n^2),但是對於輸入列表的每個元素都重複使用not in。

11

如果輸入已經排序,那麼有可能是做一個簡單的方法:

from operator import itemgetter 
from itertools import groupby 
unique_list = list(map(itemgetter(0), groupby(yourList))) 
1

>,但我不知道如何從按字母順序排列的哈希檢索列表成員。

不是真的你的主要問題,但對於將來參考使用sorted Rod的答案可用於遍歷dict的按鍵的排序順序

for key in sorted(my_dict.keys()): 
    print key, my_dict[key] 
    ... 

,也因爲tuple的由第一有序元組的成員,你可以做同樣的items

for key, val in sorted(my_dict.items()): 
    print key, val 
    ... 
0

對於字符串數據

output = [] 

    def uniq(input): 
     if input not in output: 
      output.append(input) 
print output  
4

如果要保留原始列表的順序,只需使用OrderedDict和None作爲值。

在Python2:

from collections import OrderedDict 
    from itertools import izip, repeat 

    unique_list = list(OrderedDict(izip(my_list, repeat(None)))) 

在Python3這是更簡單:

from collections import OrderedDict 
    from itertools import repeat 

    unique_list = list(OrderedDict(zip(my_list, repeat(None)))) 

如果你不喜歡的迭代器(壓縮和重複),可以使用一臺發電機(都在2 &工作3):

from collections import OrderedDict 
    unique_list = list(OrderedDict((element, None) for element in my_list)) 
相關問題