列表去重(不改变原来顺序)

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]
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容