删除列表中的重复项而不创建新列表,同时保留顺序

时间:2014-04-08 17:09:12

标签: python list sorting duplicates

输入:

glist = [1,4,2,5,2,2]

预期产出:

[1,4,2,5]

正如你所看到的,我只想删除重复项,我希望它的元素顺序相同

删除重复项的常用方法:

def remove(glist):
    result = []
    for ele in glist:
        if ele not in result:
            result.append(ele)
    return result

但是,此代码将创建一个新列表,即result。 我只是想删除重复项,没有创建新的列表/集。我希望return glist如下所示 我的python:IDLE 3.3 谢谢你们!

预期代码的介绍:

def remove(glist):
    '''code'''
    return glist

3 个答案:

答案 0 :(得分:2)

您可以使用OrderedDict

>>> glist = [1,4,2,5,2,2]
>>> from collections import OrderedDict
>>> glist = list(OrderedDict.fromkeys(glist))
>>> glist
[1, 4, 2, 5]
>>>

答案 1 :(得分:1)

假设内容是可清除的,您可以这样做,而无需在代码中创建任何列表对象:

def remove(glist):
    seen = set()
    def unseen():
        for val in glist:
            if not val in seen:
                yield val
                seen.add(val)
    glist[:] = unseen()
    return glist # if you must

这有点作弊,因为实际上glist[:] = unseen()确实从生成器函数unseen()的输出构造了一个列表,然后(有效地)将其内容传递给glist。它实际上可能不构造一个列表对象,但它使用的内存大小与它相同,因为glist的旧内容当然不会在新数组完成之前释放。

如果内容不耐用,或者你有足够的时间但没有多余的记忆,那么我想你必须以缓慢的方式去做:

idx = 0
while idx < len(glist):
    if glist[idx] in glist[0:idx]:
        del glist[idx]
    else:
        idx += 1

答案 2 :(得分:-1)

Alex的答案(完全有效)的简单版本将是:

glist = [1,4,2,5]
glist = set(glist)
print glist

一个集合不能有重复项,因此将一个列表放入集合中会删除所有重复项。