先上一下可哈希数据结构重复元素去除方法:
def dedupe(items):
seen = set()
for item in items:
if item not in seen:
yield item
seen.add(item)
不可哈希数据结构的方法类似:
def dedupe(items, key=None):
seen = set() #这里利用了set的特点,即无重复元素
for item in items:
val = item if key is None else key(item) #处理数据,使之变成可以比较的格式,即把数据解构,其中key为解构函数,val为解构后的数据
if val not in seen:
yield item #这里要塞入generator的是item,因为val只是为了方便处理生成的“中间数据”,并没有什么卵用
seen.add(val)
下面说一下使用这个函数的方法:
测试数据:
items = [{'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]
函数调用的两个示例:
1.本例中的匿名函数(即“解构函数”)表示的含义是以(x,y)这个整体为主键,去除items中与之重复的元素
print(list(dedupe(items, key=lambda d: (d['x'], d['y']))))
控制台输出结果如下:
[{'y': 2, 'x': 1}, {'y': 3, 'x': 1}, {'y': 4, 'x': 2}]
2.本例中的匿名函数(即“解构函数”)以x为主键
print(list(dedupe(items, key=lambda d: d['x'])))
控制台输出结果如下:
[{'y': 2, 'x': 1}, {'y': 4, 'x': 2}]
这里用lambda写解构函数很方便,值得学习。
另外注意一下此处的 list (代码中dedupe外面的那一个),可以直接把generator转换为list,使用起来很方便。