2010-08-25 40 views
3
In [1]: l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 

In [2]: l2 = list(set(l1)) 

In [3]: l2 
Out[3]: ['a', 0, 2, 3, 6, 9.0, 'b'] 

在這裏你可以看到列表L2中與不同的順序下降,則原來的L1,我需要刪除從我的列表中重複的元素,而不改變列表元素的序列/順序....我如何使用set維護我的列表序列?

+0

@carl - 嗯?該問題涉及列表中的重複項。這只是一個列表,但他希望在不排除其內部排序的情況下使其具有獨特性...... – Stephen 2010-08-25 05:13:21

+2

「我如何使用set來維護我的列表序列?」集合**無序**根據定義 – NullUserException 2010-08-25 05:19:23

+0

@advait關於我的答案 - 謝謝,我真的不知道它是否會成立。早上6點,所以我真的不想啓動python。試圖改變使用有序字典的答案,但我不太熟悉它們,所以我只是刪除我認爲的答案。 – Stephen 2010-08-25 06:54:41

回答

0

這是把我的頭頂部(使用類型的字典):

l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
l2 = [] 
s = {} 
for i in l1: 
    if not i in s: 
     l2.append(i) 
     s[i] = None 

# l2 contains ['a', 2, 3, 0, 9.0, 6, 'b', 'a'] 

編輯:使用套(也把我的頭頂部):

l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
l2 = [] 
s = set() 
for i in l1: 
    if not i in s: 
     l2.append(i) 
     s.add(i) 
10

如果你不關心效率,這是O(n * m個)

>>> sorted(set(l1), key=l1.index) 
['a', 2, 3, 0, 9.0, 6, 'b'] 

使用中間字典是更復雜,但是O(N + M * 10gm的)

其中n是在L1的元素數m是L1的獨特元素的數量

>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
>>> d1=dict((k,v) for v,k in enumerate(reversed(l1))) 
>>> sorted(d1, key=d1.get, reverse=True) 
['a', 2, 3, 0, 9.0, 6, 'b'] 

在Python3.1你有OrderedDict所以它很容易

>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
>>> list(OrderedDict.fromkeys(l1)) 
['a', 2, 3, 0, 9.0, 6, 'b'] 
+0

upvote for複雜性關注@John La Rooy – Ankush 2017-05-25 06:09:43

5

您可以通過定義這樣的功能解決這個問題:

def dedupe(items): 
    seen = set() 
    for item in items: 
     if item not in seen: 
      yield item 
      seen.add(item) 

要使用它:

>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a'] 
>>> l2 = list(dedupe(l1)) 
>>> l2 
['a', 2, 3, 0, 9.0, 6, 'b']