使用set时保持相同的顺序

时间:2013-10-08 15:01:19

标签: python

我的任务是使用一个集合将重复列表转换为唯一数字列表。但是,我想保留这些职位。

我想的很简单;所以我创建了一个首先存储原始列表位置的字典。

def get_positions(a): 
    positions = {}

    for ele in a: 
        if not ele in positions:
            positions[ele] = a.index(ele) 

    return positions

所以我想说我有一个列表a = [1, 2, 4, 4, 5]

职位会给我一本{0:1, 1:2, 2:4, 3:4, 4:5}字典。

然而这是不成功的,因为我重复的数字不会存储他们的位置。

有没有办法实现这个目标?

感谢。

更新:

似乎我不清楚。我需要使用一套。所以,我得到一个列表a = [1,2,4,4,5],我必须将它转换为一个集合来删除重复项。然后,我需要以相同的顺序获得包含元素的列表。 (这是一项任务问题)

5 个答案:

答案 0 :(得分:6)

您可以使用OrderedDict

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

可以也使用普通set。一种常见的方式是:

>>> a = [1, 2, 4, 4, 5]
>>> 
>>> seen = set()
>>> [x for x in a if x not in seen and not seen.add(x)]
[1, 2, 4, 5]

这里的诀窍是not seen.add(x)始终为True因为add()始终返回None。在实践中,我总是使用OrderedDict方法。

另请参阅:How do you remove duplicates from a list in Python whilst preserving order?

答案 1 :(得分:2)

我认为你这是错误的做法。您正试图从列表中删除重复项,但是您遇到了一个问题,即您要尝试解决的问题是列表中的内容位置没有重复删除。相反,我认为做更像这样的事情会更好:

def remove_duplicates(seq):
    new_list = []
    for i in seq:
        if i not in new_list:
            new_list.append(i)
    return new_list

一种可读的方法,使用集合(使用相应的O(1)成员资格测试(但具有更高的内存使用率)是这样的:

def remove_duplicates(seq):
    seen = set()
    new_list = []
    for i in seq:
        if i not in seen:
            new_list.append(i)
            seen.add(i)
    return new_list

This对同一个问题的回答也会使用集合,并且可能更快(但在使用and not set.add时使用有点hacky。)

答案 2 :(得分:1)

这可以通过循环和if语句来完成:

>>> oldlist = [1,2,3,3,4,5,4,5,6,2,3,5,7,8,3,3,3,9]
>>> newlist = []
>>> for x in oldlist:
...  if not x in newlist:
...   newlist.append(x)
...
>>> newlist
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

答案 3 :(得分:0)

将其存储为一组具有(位置,元素)的元组

答案 4 :(得分:0)

你想要一个OrderedSet。但这听起来像是一个家庭作业问题,我不知道他们是否会接受这个问题。