2013-01-23 124 views
-4

可能重複:
How do you remove duplicates from a list in Python whilst preserving order?在Python中結合列表元素?

這個問題可能是很容易的。例如,我有這樣的列表:

a = [1,1,1,1,2,3,4,5,5,5,5,6,7,7,8,9,14,14] 

我不想在我的列表中持有相同的元素。所以,我倒要其轉換爲:

a = [1,2,3,4,5,6,7,8,9,14] 

如何管理呢?先謝謝你。

+0

是否順序有關係嗎? –

+5

或訂單無關緊要,請使用'list(set(a))'。 –

+0

然後是後續問題是*你甚至想列表,或者僅僅是一個迭代?*由於在後一種情況下,爲什麼將其轉換回一個列表? 'set(a)',你在家。 – kojiro

回答

3

將其轉換爲一組:

a = list(set(a)) 
+0

這不會保留訂單 – Matt

2

列表轉換爲一組將刪除重複項,然後將其轉換回一個列表。

a = list(set(a)) 
3

您可以使用unique_everseenrecipe從itertools,它維持秩序。

如果順序並不重要,然後使用set()

In [294]: a = [1,1,1,1,2,3,4,5,5,5,5,6,7,7,8,9,14,14] 

In [295]: list(unique_everseen(a)) 
Out[295]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 14] 

unique_everseen

def unique_everseen(iterable, key=None): 
    "List unique elements, preserving order. Remember all elements ever seen." 
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D 
    # unique_everseen('ABBCcAD', str.lower) --> A B C D 
    seen = set() 
    seen_add = seen.add 
    if key is None: 
     for element in ifilterfalse(seen.__contains__, iterable): 
      seen_add(element) 
      yield element 
    else: 
     for element in iterable: 
      k = key(element) 
      if k not in seen: 
       seen_add(k) 
       yield element 
1
import itertools 
a = [k for k, g in itertools.groupby(a)] 

這假定在原來的列表中的重複的項目已分組,在你的榜樣。這種方法比使用set()的好處是,原來的順序將被保持。

0

,或者,如果需要保留sorted順序:

a = [1,1,1,1,2,3,4,5,5,5,5,6,7,7,8,9,14,14] 
sorted(set(a)) 

結果:

[1,2,3,4,5,6,7,8,9,14 ]

+0

只有輸入排序在第一位纔有效。 –

+0

如果列表最初是排序的,這隻會保留訂單。 –

+0

更改了描述。他的示例列表已排序,但編輯時我的答案更準確。謝謝。 – jimhark