【问题标题】:How can i remove overlap in list?如何删除列表中的重叠?
【发布时间】:2016-07-28 08:47:10
【问题描述】:

我做了示例 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]

我想删除列表中的重叠,但我也希望不改变顺序。

我该怎么做?

【问题讨论】:

标签: python


【解决方案1】:

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

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

【讨论】:

  • 谢谢。很有用
【解决方案2】:

我可能会这样做:

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]

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

【讨论】:

    【解决方案3】:

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

    >>> 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]
    

    条件not (x in seen or seen.add(x))works like this:如果x in seen,则or为真,因此not为假,但如果x not in seen,则or的第一部分为假,因此第二部分被执行并返回None,然后由not转换为True

    【讨论】:

    • 非常感谢您的解释。
    【解决方案4】:

    要在列表中有不同的值,只需使用以下 sn-p:

    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]))
    

    【讨论】:

    • 恕我直言,使用普通的旧 for 循环比使用 map 的副作用更 Pythonic。此外,这不适用于 Python 3。
    • @tobias_k 感谢朋友的评论。我同意你的看法。这不是pythonic的方式。但正如我现在所看到的,您还认为 OrderedDict 是一种解决方案:-)。
    【解决方案5】:

    试试这个你可以通过反转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]
    

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      相关资源
      最近更新 更多