如何删除列表中的重叠?

时间:2016-07-28 08:47:10

标签: python

我制作了示例python列表。

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

[1,3,2,2,3,4,5,1]

要删除重叠,我尝试使用set()。

print(set(list_1))
  

{1,2,3,4,5}

但我想要制作

[1,3,2,4,5]

我想在列表中删除重叠,但我也希望不要更改顺序。

我该怎么做?

5 个答案:

答案 0 :(得分:1)

您可以(ab)使用collections.OrderedDict按顺序获取唯一元素:

echo -e "#!/bin/bash" > $(dirname $0)/cgi-bin/$PHP_CGI_WRAPPER

或者,您可以将列表理解与已经看到的其他>>> 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] 项一起使用。但是,具有副作用的列表推导不被认为是最佳风格。

set

条件>>> 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] works like this:如果not (x in seen or seen.add(x)),则x in seen为真,因此or为false,但如果为not,那么x not in seen的第一部分是假的,因此第二部分被执行并返回or,然后由None转换为True

答案 1 :(得分:0)

要在列表中包含不同的值,请使用以下代码段:

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()并未保留序列的顺序。基本想法取自here

正如评论中提到的tobias_k,这个解决方案不能使用Python 3.如果你使用Python 3,你可以通过一个简单的for循环(tobias_k的想法)迭代你的列表或使用像OrderedDict这样的库:

from collections import OrderedDict

list(OrderedDict.fromkeys([1,3,2,2,3,4,5,1]))

答案 2 :(得分:0)

尝试此操作您可以使用反转list来执行此操作,而无需使用任何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]

答案 3 :(得分:0)

我可能会这样做:

seen = set()
result
for i in the_list:
  if i not in seen:
    seen.add(i)
    result.append(i)

我使用seen进行快速查询,但result.append方法调用的时间复杂度仍未知。

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

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

但是!这依赖于映射中的副作用,因此它不太理想。

答案 4 :(得分:0)

你可以使用list-comprehension with filter(首先初始化空列表,忽略结果列表)

list_u = []
[list_u.append(v) for v in list_1 if v not in list_u]