1. 利用集合去重,再利用sort函数排序,排序索引按照l1的index
l1 = [3, 2, 1, 2]
l2 = list(set(l1))
l2.sort(key=l1.index)
print(l2)
2. 如果序列中的值都是可hashable
的,可以用生成器来解决,这里入了一个概念hashable
,那么什么是hashable
呢?
官方文档解释
如果一个对象在其生命周期内有一个固定不变的哈希值 (这需要hash()方法) 且可以与其他对象进行比较操作 (这需要eq()方法) ,那么这个对象就是可哈希对象 (hashable) 。可哈希对象必须有相同的哈希值才算作相等。
由于字典 (dict) 的键 (key) 和集合 (set) 内部使用到了哈希值,所以只有可哈希 (hashable) 对象才能被用作字典的键和集合的元素。
所有python内置的不可变对象都是可哈希的,同时,可变容器 (比如:列表 (list) 或者字典 (dict) ) 都是不可哈希的。用户自定义的类的实例默认情况下都是可哈希的;它们跟其它对象都不相等 (除了它们自己) ,它们的哈希值来自id()方法。
下面举例说明一下
a = 5
id(a)
Out[65]: 140720591118864
a = 10
id(a) # 修改a的值的时候,id值也在改变
Out[67]: 140720591119024
b = [1, 2, 3, 4]
id(b)
Out[69]: 2506729947912
b[1] = 10
id(b)
Out[71]: 2506729947912 # 不可变对象内容改变,其id不会变化
说回正题
list_demo = [1, 2, 3, 4, 2, 1]
def dedupe(items):
seen = set()
for item in items:
if item not in seen:
yield item
seen.add(item)
return seen
y = dedupe(items=list_demo)
print(list(y))
3. 如果想消除序列中不可 hashable
,需要将第二种方法稍微改变下
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}]
4.利用字典的formkeys()
方法
语法:dict.fromkeys(seq[, value]
描述:此函数主要用于创建一个新的字典,用序列中的seq
做字典的键,用value
做所有字典键对应的值,默认为None
返回值:字典
list({}.fromkeys([1, 2, 3, 1, 2, 3]).keys())
Out[7]: [1, 2, 3]