我的任务是使用一个集合将重复列表转换为唯一数字列表。但是,我想保留这些职位。
我想的很简单;所以我创建了一个首先存储原始列表位置的字典。
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],我必须将它转换为一个集合来删除重复项。然后,我需要以相同的顺序获得包含元素的列表。 (这是一项任务问题)
答案 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。但这听起来像是一个家庭作业问题,我不知道他们是否会接受这个问题。