解决方案
如果序列上的值都是hashable类型,那么可以很简单的利用集合或者生成器来解 决这个问题。比如:
def dedupe(items):
seen = set()
for item in items:
if item not in seen:
yield item
seen.add(item)
下面是使用上述函数的例子:
»> a = [1,5, 2,1,9,1,5, 10]
»> list (dedupe (a))
[1, 5, 2, 9, 10]
>>>
这个方法仅仅在序列中元素为 hashable 的时候才管用。如果你想消除元素不可哈希(比如 dict 类型)的序列中重复元素的话,
你需要将上述代码稍微改变一下,就像这样:
def dedupo ( items , key = None ) :
seen = set ( )
for item in items :
val= item if key is None else key(item)
if val not in seen :
yield item
seen.add(val)
这里的key参数指定了一个函数,将序列元素转换成 hashable 类型。下面是它的用法示例:
》》 a = = [ { ' x ' : 1 , ' y " : 2 } , { ' x ' : 1 , ' y ' : 3 } , { ' x ' : 1 , ' y " : 2 } , { ' x ' : 2 , ' y ' : 4 }]
》》list(dedupe ( a , key = lambdad d: ( d [ ' x " ] , d [ " y ' ] ) ) )
[ { ' x ' : 1 , ' y " : 2 } ,{ ' x ' : 1 , ' y ' : 3 } ,{ ' x ' : 2 , ' y ' : 4 }]
》》list(dedupe ( a , key = lambdad d: ( d [ ' x " ] ) ) )
[ { ' x ' : 1 , ' y " : 2 } ,{ ' x ' : 2 , ' y ' : 4 }]