0.摘要
本文主要介绍去除序列中重复的元素,并保持剩下元素顺序不变的方法。
1.转set()
如果只想去除重复元素,而不关心顺序问题,可以将序列转为set,从而达到简单快速去重的效果。
a = [1,2,3,4,5,6,5,4,3,2,1,7,8,9]
a = list(set(a))
print(a)
#result:[1, 2, 3, 4, 5, 6, 7, 8, 9]
再次强调,这种方法不能保证剩下的元素顺序不变。
2.借助集合和生成器
def dedupe(items):
seen = set()
for item in items:
if item not in seen:
yield item
seen.add(item)
if __name__ == '__main__':
a = [1, 5, 2, 1, 9, 1, 5, 10]
print(a)
print(list(dedupe(a)))
注意:这种方法只有在序列中的元素是可哈希的时候才适用。
可哈希:如果一个对象是可哈希的,那么在它的生存期内必须是不可变的,他需要有一个__hash__()方法。整数、浮点数、字符串、元组都是不可变的。
3.不可哈希对象
如果序列中对象不可哈希,那么可以先将对象转为可哈希的。这里模仿sorted、max()、min()方法,设置一个key参数。
# example2.py
#
# Remove duplicate entries from a sequence while keeping order
def dedupe(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)
if __name__ == '__main__':
a = [
{'x': 2, 'y': 3},
{'x': 1, 'y': 4},
{'x': 2, 'y': 3},
{'x': 2, 'y': 3},
{'x': 10, 'y': 15}
]
print(a)
print(list(dedupe(a, key=lambda a: (a['x'],a['y']))))
4.实际应用
在实际应用中,我们处理的数据并不局限于列表,比如去除重复文本行也可以使用这样的方法。
with open(file_path,'r') as f:
for line in dedupe(f):
……