-1

我的数据如下所示:

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

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

['b', 'c']

当我使用该set功能时,我得到:

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

这不是我想要的。

4

4 回答 4

2

一种选择是(源自 Ritesh Kumar在此处的回答)

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

这使

>>> onlySingles
['b', 'c']
于 2014-12-21T20:33:47.590 回答
1

尝试这个,

>>> let
['a', 'b', 'a', 'c', 'a']
>>> dict.fromkeys(let).keys()
['a', 'c', 'b']
>>> 
于 2014-12-22T02:07:28.637 回答
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']
于 2014-12-22T08:41:45.240 回答
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),与基于树的集合相同。

于 2014-12-22T02:31:30.697 回答