2010-08-25 39 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']