from operator import itemgetter
from itertools import groupby, imap
def unique_justseen(iterable, key=None):
"List unique elements, preserving order. Remember only the element just seen."
# unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
# unique_justseen('ABBCcAD', str.lower) --> A B C A D
return imap(next, imap(itemgetter(1), groupby(iterable, key)))如果您只能假定可订购元素,则此处使用bisect模块进行变体。给定具有r个唯一值的n个输入,其搜索步骤花费O(n log r)。如果找到新的唯一值,则将其插入到查看列表中,成本为O(r * r)。
from bisect import bisect_left, insort
def dedup(seq):
'Remove duplicates. Preserve order first seen. Assume orderable, but not hashable elements'
result = []
seen = []
for x in seq:
i = bisect_left(seen, x)
if i == len(seen) or seen[i] != x:
seen.insert(i, x)
result.append(x)
return result