【问题标题】:Removing duplicates (not by using set)删除重复项(不使用集合)
【发布时间】:2015-02-20 00:07:25
【问题描述】:

我的数据如下所示:

let = ['a', 'b', 'a', 'c', 'a']

如何删除重复项?我希望我的输出是这样的:

['b', 'c']

当我使用set 函数时,我得到:

set(['a', 'c', 'b'])

这不是我想要的。

【问题讨论】:

  • 什么语言? (编辑您的问题并将其添加到标签中)
  • @michnguyen 您将不得不进一步说明您要完成的工作,因为它似乎不仅仅是删除重复项(如果是这样,那么“a”将包含在结果中)。

标签: python python-2.7 no-duplicates


【解决方案1】:

一种选择是(源自 Ritesh Kumar 的回答 here

let = ['a', 'b', 'a', 'c', 'a']
onlySingles = [x for x in let if let.count(x) < 2]

给了

>>> onlySingles
['b', 'c']

【讨论】:

  • 每次运行let.count 相当繁重
  • 例如:这会使let 的线性扫描超过 25 次。要么排序/分组,要么做一个线性频率计数一次,这可以减少键空间,然后迭代那个......更糟糕的情况是2N
【解决方案2】:

试试这个,

>>> let
['a', 'b', 'a', 'c', 'a']
>>> dict.fromkeys(let).keys()
['a', 'c', 'b']
>>> 

【讨论】:

  • 这基本上是变相使用一套。
【解决方案3】:

对输入进行排序,然后删除重复项变得微不足道:

data = ['a', 'b', 'a', 'c', 'a']

def uniq(data):
  last = None
  result = []
  for item in data:
    if item != last:
      result.append(item)
      last = item
  return result

print uniq(sorted(data))
# prints ['a', 'b', 'c']

这基本上是shell 的cat data | sort | uniq 成语。 成本为 O(N * log N),与基于树的集合相同。

【讨论】:

    【解决方案4】:

    而不是每次都对主列表进行排序或线性扫描和重新计数。

    计算出现次数,然后过滤出现一次的项目...

    >>> from collections import Counter
    >>> let = ['a', 'b', 'a', 'c', 'a']
    >>> [k for k, v in Counter(let).items() if v == 1]
    ['c', 'b']
    

    无论如何,您必须至少查看一次序列 - 尽管限制您这样做的次数是有意义的。

    如果您真的想避免使用任何类型或set 或其他散列容器(因为您可能无法使用它们?),那么是的,您可以对其进行排序,然后使用:

    >>> from itertools import groupby, islice
    >>> [k for k,v in groupby(sorted(let)) if len(list(islice(v, 2))) == 1]
    ['b', 'c']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2015-11-24
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多