删除重复项(不使用set)

时间:2014-12-21 20:21:18

标签: python python-2.7 no-duplicates

我的数据如下:

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

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

['b', 'c']

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

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

这不是我想要的。

4 个答案:

答案 0 :(得分:2)

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

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

给出了

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

答案 1 :(得分:1)

试试这个,

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

答案 2 :(得分:0)

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

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),与基于树的集合相同。

答案 3 :(得分:0)

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

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

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