如何使用set维护列表的顺序?

2024-04-23 21:31:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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,我需要从列表中删除重复的元素,而不改变列表元素的顺序。。。。


Tags: in元素l1列表顺序outlistset
3条回答

这是我脑子里想出来的(用听写):

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)

如果你不关心效率,这是O(n*m)

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

使用中间dict比较复杂,但它是O(n+m*logm)

其中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中,您已经订购了dict,因此非常简单

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

您可以通过定义这样的函数来解决它:

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']

相关问题 更多 >