【问题标题】:element that appear more that once in the list in Python [closed]在Python列表中出现多次的元素[关闭]
【发布时间】:2011-02-20 08:48:29
【问题描述】:

请帮忙(我知道这是一个愚蠢的问题):

我有一个列表d = [' ABA', ' AAB', ' BAA', ' BAA', ' AAB', ' ABA']。如何排除多次出现的元素?

【问题讨论】:

  • 预期输出是什么? [][' ABA', ' AAB', ' BAA']?
  • 您希望我们删除多次出现的值,还是只排除多次出现的值?您是否关心保留列表的原始顺序?

标签: python list element


【解决方案1】:

从列表中排除多次出现的项目:

d = [x for x in d if d.count(x) == 1]

对于上面提供的示例,d 将绑定到一个空列表。

其他人发布了删除重复项的良好解决方案。

【讨论】:

  • 请注意,循环 d 并找到每个元素的计数总是 O(n^2)。使用...for x in set(d)... 代替具有许多重复项的列表。
【解决方案2】:

转换为一组然后再返回:

list(set(d))

如果顺序很重要,您可以通过记住原始索引的 dict 传递值。这种方法虽然可以表达为单个表达式,但要复杂得多:

[x for (i, x) in sorted((i, x) for (x, i) in dict((x, i) for (i, x) in reversed(list(enumerate(d)))).iteritems())]

当然,您不必使用推导式。对于这个问题,有一个相当简单的解决方案:

a = []
for x in d:
    if x not in a:
        a.append(x)

请注意,两种保留顺序的解决方案都假定您希望保留每个重复元素的第一次出现。

【讨论】:

  • 不幸的是,您的 for 循环解决方案是 O(N**2)
  • @John:是的,for 循环是 O(N**2)。这是否不幸取决于几个因素,包括输入数组的大小和有多少重复。
  • 这里的 list(set(d)) 'list' 是什么意思?
  • 是Python列表的类型;即[1, 2, 3].__class__ == list。它的构造函数接受任何序列,包括set
【解决方案3】:

假设您有一个名为 Words 的列表和一个名为 UniqueWords 的列表,在 Words 上开始一个循环,在每次迭代时检查列表 UniqueWords 是否包含迭代元素,如果是,则 continue ,如果没有,则将其添加到 UniqueWords。最后,您将获得一个没有重复的列表。您可以做的另一种方法是循环中的循环,而不是添加,如果发现不止一次,您将删除它:)

我敢打赌,还有更有效的方法。

【讨论】:

    【解决方案4】:

    如果您不担心订单,d = list(set(d)))

    【讨论】:

      【解决方案5】:

      如果订单很重要,请查看 itertools recpies 文档中的 unique_everseen 函数。它提供了一个相对干净的基于迭代器的解决方案。

      如果顺序无关紧要,请转换为一组。

      【讨论】:

        【解决方案6】:

        如果您不应该这样做,请务必阅读the python docs on itertools,尤其是product()、permutations() 和combinations()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多