Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用字典从列表中删除重复项,同时保持顺序_Python_List_Dictionary - Fatal编程技术网

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的作业问题。