Python 使用set时保持相同的顺序

Python 使用set时保持相同的顺序,python,Python,我的任务是使用集合将重复列表转换为唯一数字列表。但是,我想保留这些职位 def get_positions(a): positions = {} for ele in a: if not ele in positions: positions[ele] = a.index(ele) return positions 我想这很简单;所以我制作了一本字典,首先存储原始列表的位置 def get_positions(a):

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

def get_positions(a): 
    positions = {}

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

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

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],我必须将它转换成一个集合来删除重复项。然后,我需要得到一个元素顺序相同的列表。(这是一个作业问题)

您可以使用:


您也可以为此使用普通的
集合。一种常见的方法是:

>>> 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]
这里的诀窍是
不可见。add(x)
将始终为
True
,因为
add()
始终返回
None
。实际上,我总是使用
OrderedDict
方法


另请参见:

我认为您的做法是错误的。您正试图从列表中删除重复项,但您遇到了一个问题,您正试图通过在不删除重复项的情况下在列表中保留事物的位置来解决该问题。相反,我认为这样做会更好:

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)成员资格测试(但具有更高的内存使用率)来实现这一点的一种相当可读的方法是:


对同一问题的回答也使用集合,而且速度可能更快(但在使用
和不使用set.add
时使用了一些技巧)。

这可以通过循环和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]
>>>

将其存储为一组元组(位置、元素)

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

您只需要原始数字在原始列表中首次出现的顺序吗?是的,因此对于带有a的示例,我需要返回一个具有[1、2、4、5]的列表可能的重复正如你所知,你一直说你在“使用一个集合”,但是
位置
被定义为
{}
,这是一个空的“字典”或“映射”,不是一个集合。这是一个编程类的任意赋值吗?如果有很多方法可以使用“集合”来完成它。你能提供需求的全部细节吗,因为我认为我们遗漏了一些东西。这个问题是列表上的成员资格测试是O(n),这使得它成为O(n^2)算法——实际上,你可以使用集合或dicts在O(n)运算中完成这项任务。@mgilson但是在可读性方面(除了我调用参数x),很可能在内存使用方面(你不必存储元素的位置),我认为这更好。毕竟,“过早优化是万恶之路”!@user2417731——你可以很容易地修改它以使用一个集合。只需在
new_list
之外保留一个集合,然后对
set
@user2387370:
seen={}进行成员资格测试
使seen成为一个
dict
,而不是
集合
。我想您需要
seen=set()
。您可以使用
.fromkeys()
。我更新了我的问题。请看。我被要求使用set.Arshaji,所以在第二个技巧中,你使用了和的短路行为。我正确吗?@Arshaji谢谢Arshjit,你的回答很有帮助。我仍然是python学习者。我刚刚阅读了这篇文章,所以如果我理解正确,你的第一个技巧比第二个要好。
>>> 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]
>>>