有序集Python2.7

2024-05-16 09:18:18 发布

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

我有一个列表,正试图从中删除重复项。我使用的是Python2.7.1,因此可以简单地使用set()函数。不过,这会重新排列我的列表。这对我来说是不可接受的。

下面是我编写的一个函数;它可以实现这一点。不过,我想知道是否有更好/更快的方法。如有任何意见,将不胜感激。

    def ordered_set(list_):

        newlist = []
        lastitem = None
        for item in list_:

            if item != lastitem:
                newlist.append(item)
                lastitem = item

        return newlist

上面的函数假设没有一个项是,并且这些项是有序的(即,['a'、'a'、'b'、'b'、'c'、'd']

上述函数返回['a'、'a'、'a'、'b'、'b'、'c'、'd']['a'、'b'、'c'、'd']


Tags: 方法函数none列表fordefitemlist
3条回答

另一种非常快速的set方法:

def remove_duplicates(lst):
    dset = set()
    # relies on the fact that dset.add() always returns None.
    return [item for item in lst
            if item not in dset and not dset.add(item)] 

使用订购的信息:

from collections import OrderedDict

l = ['a', 'a', 'a', 'b', 'b', 'c', 'd']
d = OrderedDict()

for x in l:
    d[x] = True

# prints a b c d
for x in d:
    print x,
print

假设输入序列是无序的,这里有O(N)解(在空间和时间上)。 它生成一个删除了重复项的序列,同时将唯一项保留为它们在输入序列中出现的相同相对顺序。

>>> def remove_dups_stable(s):
...   seen = set()
...   for i in s:
...     if i not in seen:
...       yield i
...       seen.add(i)

>>> list(remove_dups_stable(['q', 'w', 'e', 'r', 'q', 'w', 'y', 'u', 'i', 't', 'e', 'p', 't', 'y', 'e']))
['q', 'w', 'e', 'r', 'y', 'u', 'i', 't', 'p']

相关问题 更多 >