不管顺序的去重转为set即可
1.将序列中重复元素去除,并保持顺序
#如果序列items中的值是可哈希的
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]
写成函数形式是使程序更通用,如读文件去除重复行:
with open(somefile,'r') as f:
for line in dedupe(f):
...
# 如果序列items中的值是不可哈希-这个更通用,也支持可哈希序列
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)
>>> a = [ {'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]
>>> list(dedupe(a, key=lambda d: (d['x'],d['y'])))
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 4}]
>>> list(dedupe(a, key=lambda d: d['x']))
[{'x': 1, 'y': 2}, {'x': 2, 'y': 4}]
其中,key是一个从不可哈希值转为可哈希值的函数,并按key()的返回值去重,若值已经可哈希,则令key=None
hashable -- 可哈希
一个对象的哈希值如果在其生命周期内绝不改变,就被称为 可哈希 (它需要具有 __hash__()
方法),并可以同其他对象进行比较(它需要具有 __eq__()
方法)。可哈希对象必须具有相同的哈希值比较结果才会相同。
可哈希性使得对象能够作为字典键或集合成员使用,因为这些数据结构要在内部使用哈希值。
大多数 Python 中的不可变内置对象都是可哈希的;可变容器(例如列表或字典)都不可哈希;不可变容器(例如元组和 frozenset)仅当它们的元素均为可哈希时才是可哈希的。 用户定义类的实例对象默认是可哈希的。 它们在比较时一定不相同(除非是与自己比较),它们的哈希值的生成是基于它们的 id()
。
List
x = [1,2,3]
y = {x: 9}#生成字典y报错
Traceback (most recent call last):
File "", line 1, in
TypeError: unhashable type: 'list'
Tuple
z = (5,6)
y = {z: 89}
print(y)
{(5, 6): 89}
yield详解:
https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
https://www.jianshu.com/p/d09778f4e055
https://blog.csdn.net/dcrmg/article/details/78128041