有序集Python 2.7

rec*_*gle 12 python list set python-2.7

我有一个列表,我试图从中删除重复的项目.我正在使用python 2.7.1所以我可以简单地使用set()函数.但是,这会重新排序我的列表.对于我的具体情况,这是不可接受的.

下面是我写的一个函数; 这样做.但是我想知道是否有更好/更快的方式.对此也有任何意见,将不胜感激.

    def ordered_set(list_):

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

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

        return newlist
Run Code Online (Sandbox Code Playgroud)

上面的函数假设没有项目是None,并且项目是有序的(即,''a','a','a','b','b','c','d '])

上面的函数将['a','a','a','b','b','c','d']作为['a','b','c','d'返回].

Zau*_*bov 12

另一个非常快速的方法:

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)] 
Run Code Online (Sandbox Code Playgroud)


mhy*_*itz 8

使用OrderedDict:

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
Run Code Online (Sandbox Code Playgroud)

  • 我以前从未见过被描述为"一堆O(1)操作"的for循环.Hm,n O(1)操作将是...... O(n) (19认同)
  • 这需要通过耐用的元素; 例如,如果元素是列表或字典,这将不起作用; 此外,这需要一个"O(n)"操作,而不是一堆"O(1)"操作(可能是也可能不是OP想要的,只需记住一些事情) (2认同)

Pav*_*pin 7

假设输入序列是无序的,这里是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']
Run Code Online (Sandbox Code Playgroud)


sun*_*tos 5

我知道这已经得到了解答,但是这里有一个单行(加上导入):

from collections import OrderedDict
def dedupe(_list):
    return OrderedDict((item,None) for item in _list).keys()

>>> dedupe(['q', 'w', 'e', 'r', 'q', 'w', 'y', 'u', 'i', 't', 'e', 'p', 't', 'y', 'e'])
['q', 'w', 'e', 'r', 'y', 'u', 'i', 't', 'p']
Run Code Online (Sandbox Code Playgroud)