Python 删除重复项(不使用set)
我的数据如下所示:Python 删除重复项(不使用set),python,python-2.7,no-duplicates,Python,Python 2.7,No Duplicates,我的数据如下所示: let = ['a', 'b', 'a', 'c', 'a'] ['b', 'c'] 如何删除重复项?我希望我的输出是这样的: let = ['a', 'b', 'a', 'c', 'a'] ['b', 'c'] 当我使用set函数时,我得到: set(['a', 'c', 'b']) 这不是我想要的。一个选项是从Ritesh Kumar的答案中推导出来的 试试这个 >>> let ['a', 'b', 'a', 'c', 'a'] >>
let = ['a', 'b', 'a', 'c', 'a']
['b', 'c']
如何删除重复项?我希望我的输出是这样的:
let = ['a', 'b', 'a', 'c', 'a']
['b', 'c']
当我使用set函数时,我得到:
set(['a', 'c', 'b'])
这不是我想要的。一个选项是从Ritesh Kumar的答案中推导出来的 试试这个
>>> let
['a', 'b', 'a', 'c', 'a']
>>> dict.fromkeys(let).keys()
['a', 'c', 'b']
>>>
对输入进行排序,然后删除重复项变得很简单:
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数据| sort | uniq习惯用法。
成本在*logn上,与基于树的集合相同。而不是排序,或者每次线性扫描并重新计算主列表的出现次数 计算出现次数,然后筛选出现一次的项目
>>> from collections import Counter
>>> let = ['a', 'b', 'a', 'c', 'a']
>>> [k for k, v in Counter(let).items() if v == 1]
['c', 'b']
不管怎样,你必须至少看一次序列——尽管限制这样做的次数是有意义的
如果您确实希望避免使用任何类型、集合或散列容器,因为您可能无法使用它们,那么可以对其进行排序,然后使用:
>>> from itertools import groupby, islice
>>> [k for k,v in groupby(sorted(let)) if len(list(islice(v, 2))) == 1]
['b', 'c']
用什么语言?编辑您的问题并将其添加到tags@michnguyen你必须对你想要完成的事情做更多的澄清,因为如果是这样的话,它似乎不仅仅是删除重复项,然后结果中会包含“a”。这基本上是在伪装中使用一个集合。每次运行let.count都相当繁重。例如:这会对let进行25次线性扫描。可以进行排序/分组,也可以进行一次线性频率计数,这样可以减少密钥空间,然后迭代该密钥空间。。。对于后者,更糟糕的情况是2N