Python 如何删除列表中的重叠?

Python 如何删除列表中的重叠?,python,Python,我制作了python列表示例 list_1 = [1,3,2,2,3,4,5,1] print(list_1) [1,3,2,2,3,4,5,1] 为了消除重叠,我尝试使用set() {1,2,3,4,5} 但我想做些什么 [1,3,2,4,5] 我想删除列表中的重叠,但我也不想改变顺序 如何才能做到这一点?要在列表中具有不同的值,只需使用以下代码段: l = [1,3,2,2,3,4,5,1] result = list() map(lambda x: not x in result an

我制作了python列表示例

list_1 = [1,3,2,2,3,4,5,1]
print(list_1)
[1,3,2,2,3,4,5,1]

为了消除重叠,我尝试使用set()

{1,2,3,4,5}

但我想做些什么

[1,3,2,4,5]
我想删除列表中的重叠,但我也不想改变顺序


如何才能做到这一点?

要在列表中具有不同的值,只需使用以下代码段:

l = [1,3,2,2,3,4,5,1]
result = list()
map(lambda x: not x in result and result.append(x), l)
print(result) #[1,3,2,4,5]
正如您已经发现的,
set()
不会保留序列的顺序。其基本思想来源于


正如tobias_k在评论中提到的,这个解决方案不适用于Python 3。如果您使用Python3,您可以使用一个简单的for循环(tobias_k的想法)来迭代列表,或者使用像
OrderedDict
这样的库:

from collections import OrderedDict

list(OrderedDict.fromkeys([1,3,2,2,3,4,5,1]))
您可以使用(ab)按顺序获取唯一元素:

>>> list_1 = [1,3,2,2,3,4,5,1]
>>> from collections import OrderedDict
>>> list(OrderedDict((x, None) for x in list_1))
[1, 3, 2, 4, 5]

或者,您可以将列表理解与已看到项目的附加集一起使用。然而,有副作用的列表理解并不是最好的风格

>>> list_1 = [1,3,2,2,3,4,5,1]
>>> seen = set()
>>> [x for x in list_1 if not (x in seen or seen.add(x))]
[1, 3, 2, 4, 5]

条件
not(x in seen或seen.add(x))
:如果
x in seen
,则
为true,因此
not
为false,但如果
x not in seen
,则
的第一部分为false,因此执行第二部分并返回
None
,然后由
not
将其转换为
True
尝试此操作。您可以使用反转
列表来执行此操作,而无需使用任何python库

>>> list_1 = [1,3,2,2,3,4,5,1]
>>> list_1.reverse()
>>> for i in list_1:
...     if(list_1.count(i)>1):
...        list_1.remove(i)
... 
>>> list_1.reverse()
>>> list_1
[1, 3, 2, 4, 5]

我可能会这样做:

seen = set()
result
for i in the_list:
  if i not in seen:
    seen.add(i)
    result.append(i)
我使用
seen
进行快速查找,仍然未知
结果的时间复杂度。append
方法调用

这也可以作为列表理解,代价是在一个可怕的混乱中混合功能代码和命令代码:

seen = set()
def process(e):
  seen.add(e)
  return e
[process(element) for element in the_list if element not in seen]

但是!这取决于映射中的副作用,因此不太理想

您可以将列表理解与过滤器一起使用(首先初始化空列表,忽略结果列表)


对于副作用,使用普通的
循环比使用
map
效果更好。另外,这在Python 3中也不起作用。@tobias_k谢谢你的评论。我同意你的看法。这不是蟒蛇式的方式。但正如我现在看到的,您也认为OrderedDict是一种解决方案:-)。可能是重复的谢谢。谢谢你的善意解释。
seen = set()
def process(e):
  seen.add(e)
  return e
[process(element) for element in the_list if element not in seen]
list_u = []
[list_u.append(v) for v in list_1 if v not in list_u]