Python:使用字典从列表中删除重复项,同时保持顺序
我有一份清单:Python:使用字典从列表中删除重复项,同时保持顺序,python,list,dictionary,Python,List,Dictionary,我有一份清单: >>> a = big_list(30) >>> a [-14, -13, 10, 7, -10, 5, 3, 10, 8, -13, 14, -12, 6, 10, 8, 7, 4, -8, -10, -3, -6, 2, -6, 3, -3, 0, -13, -14, 2, -12] 我需要在使用字典保持顺序的同时从一个数据库中删除重复项 到目前为止,我使用此代码将 def only_once(a): i = iter(a)
>>> a = big_list(30)
>>> a
[-14, -13, 10, 7, -10, 5, 3, 10, 8, -13, 14, -12, 6, 10, 8, 7, 4, -8, -10, -3, -6, 2, -6, 3, -3, 0, -13, -14, 2, -12]
我需要在使用字典保持顺序的同时从一个数据库中删除重复项
到目前为止,我使用此代码将
def only_once(a):
i = iter(a)
print dict(zip(i,i))
结果是:
>>> only_once(a)
{2: -12, 3: 10, 4: -8, 6: 10, 8: 7, 10: 7, 14: -12, -14: -13, -13: -14, -10: -3, -6: 3, -3: 0}
有重复项,而且它们是按奇数顺序排列的,在保持顺序和删除重复项的同时,如何将其转换回列表中,您有什么想法吗?使用有序信息技术:
x = [-14, -13, 10, 7, -10, 5, 3, 10, 8, -13, 14, -12, 6, 10, 8, 7, 4, -8, -10, -3, -6, 2, -6, 3, -3, 0, -13, -14, 2, -12]
from collections import OrderedDict
d = OrderedDict.fromkeys(x)
x = list(d)
只要每个副本的第一次出现仍然在同一位置,顺序就保留在这里。字典不存储顺序。若要仅使用纯词典执行您试图执行的操作,还需要将位置存储在词典的列表中
def only_once(a):
d = dict((b,a) for (a,b) in enumerate(a))
new = d.items()
return [x[0] for x in sorted(new, key=lambda a: a[1])]
这将创建一个字典,其中键是元素,值是列表中的位置,这意味着元素的第一个匹配项将被后面的匹配项覆盖(调用reversed()
切换此行为)。然后,将从字典中拉出(键、值)
对,按列表中的位置排序,并截断为仅包含元素
d = {e: i for i, e in enumerate (a) }
a = [x for x, _ in sorted(d.items (), key = lambda x: x [1] ) ]
当一个项目在原始列表中多次出现时,它的最后一次出现将被保留。创建一组您保留的项目,并放弃您已经保留的项目:
>>> a = [-14, -13, 10, 7, -10, 5, 3, 10, 8, -13, 14, -12, 6, 10, 8, 7, 4, -8, -10, -3, -6, 2, -6, 3, -3, 0, -13, -14, 2, -12]
>>> s = set()
>>> [ item for item in a if item not in s and s.add(item) == None]
[-14, -13, 10, 7, -10, 5, 3, 8, 14, -12, 6, 4, -8, -3, -6, 2, 0]
字典可以用来代替集合
,但它是非常人工的:
>>> d = {}
>>> [ item for item in a if item not in d and d.update({item:None}) == None]
[-14, -13, 10, 7, -10, 5, 3, 8, 14, -12, 6, 4, -8, -3, -6, 2, 0]
由于您没有指定字典需要如何使用,也没有迹象表明代码需要高效,因此我猜有很多可能的答案。e、 g.使用指数
first_index = {v: len(a) - 1 - i for i, v in enumerate(reversed(a))}
print [v for i, v in enumerate(a) if i == first_index[v]]
(我假设您希望删除列表中后面出现的重复项,同时保留第一次出现的项。)我不相信OP需要
iter
,并且在该代码中使用iter(x)
两次是没有意义的-它总是x
。。。此外,无需使用.keys()
-只需使用列表(d)
无需使用邮政编码,只需使用OrderedDict.fromkeys
。但是如果这是答案,那么这个问题就是右侧链接的许多问题的重复。请看一看独特的配方。如果您只是删除重复项-您不需要像这样将实际项作为键/值对放置…如果预期结果不是字典,则无需人工使用字典。一个集合
通常更适合于处理重复项。只有一次([1,1,1,3,3,2,2])
产生[0,1,2,5,6,3,4]
。不幸的是,这非常低效(O(n^2))。它对列表进行切片(每次迭代O(n))并对项目进行线性搜索(每次迭代另一个O(n))。更改为O(n)解决方案。问题说明解决方案应使用字典。如果预期结果不是字典,则无需人工使用字典。另外,集合
可以在字典中更改。@B尽管我同意这种需要是人为的,但考虑到OP的最后一个问题是如何使用集合
,我很确定我们只是在处理OP的作业问题。