0

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

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

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] ,我必须将它转换为一个集合以删除重复项。然后,我需要以相同的顺序获取一个包含元素的列表。(这是一个分配问题)

4

5 回答 5

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方法。

另请参阅:如何在保留顺序的同时从 Python 列表中删除重复项?

于 2013-10-08T15:04:25.373 回答
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

对同一问题的这个答案也使用了集合,并且很可能更快(但在 using 中使用了一些 hacky and not set.add)。

于 2013-10-08T15:05:32.773 回答
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]
>>>
于 2013-10-08T15:05:46.373 回答
0

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

于 2013-10-08T15:16:56.783 回答
0

将其存储为具有 (position, element) 的一组元组

于 2013-10-08T15:06:02.853 回答