python中如何去重

一、列表中去重

一、使用for循环实现列表去重

此方法去重后,原顺序保持不变。

# for循环实现列表去重
 
list1 = ['a', 'b', 1, 3, 9, 9, 'a']
 
list2 = []
 
for l1 in list1:
 
    if l1 not in list2:
 
        list2.append(l1)
 
print(list2)
# 结果:[‘a’, ‘b’, 1, 3, 9]

 

二、使用列表推导式去重

此方法去重后,原顺序保持不变。

# 使用列表推导式去重
 
list1 = ['a', 'b', 1, 3, 9, 9, 'a']
 
res = []
 
[res.append(i) for i in list1 if i not in res]
 
print(res)

# 结果:[‘a’, ‘b’, 1, 3, 9]

 

三、使用集合转换函数set()实现列表去重

原理:同一个集合的元素之间是不允许重复的

# set()列表去重
 
list1 = ['a', 'b', 1, 3, 9, 9, 'a']
 
list2 = list(set(list1))
 
print(list2)
# 结果:[1, 3, 9, ‘b’, ‘a’]

问题:使用set()函数去重后,会自动排序,则原列表的顺序会发生改变

解决办法有2种:
第一种方法,使用sort()方法

# # 第一种方法,sort()
 
list1 = ['a', 'b', 1, 3, 9, 9, 'a']
 
list2 = list(set(list1))
 
list2.sort(key=list1.index)
 
print(list2)
# 结果:[‘a’, ‘b’, 1, 3, 9]

注:sort()方法没有返回值,对列表元素进行原地排序
第二种方法,使用sorted()函数

# 第二种方法,sored()
 
list1 = ['a', 'b', 1, 3, 9, 9, 'a']
 
list2 = sorted(list(set(list1)), key=list1.index)
 
print(list2)
# 结果:[‘a’, ‘b’, 1, 3, 9]

注:python内置函数sorted()函数返回新的列表,并不对原列表做任何修改

 

四、使用新建字典方式实现列表去重

原理:字典的"键"是不允许重复的
此方法去重后,原来顺序保持不变。

# 使用新建字典实现列表去重
 
list1 = ['a', 'b', 1, 3, 9, 9, 'a']
 
dic = {}
 
dic = dic.fromkeys(list1).keys()
 
print(list(dic)) 结果:[‘a’, ‘b’, 1, 3, 9]

 

五、删除列表中存在重复的数据

上面的4种去重方法,都是保留一个,删除其他
下面这种方法则是,只要存在重复,一个都不保留

# 删除存在重复的值,不保留
 
list1 = ['a', 'b', 1, 3, 9, 9, 'a']
 
list2 = [i for i in list1 if list1.count(i) == 1]
 
print(list2)
# 结果:[‘b’, 1, 3]

 

二、列表中套字典去重

1.方式1:

from functools import reduce #导入排序模块
def list_dict_duplicate_removal():
    data_list = [{"a": "123", "b": "321"}, {"a": "123", "b": "321"}, {"b": "321", "a": "123"}]
    run_function = lambda x, y: x if y in x else x + [y]
    return reduce(run_function, [[], ] + data_list)
 
 
if __name__ == '__main__':
    print list_dict_duplicate_removal()
# [{'a': '123', 'b': '321'}]

 2.方式2:

data_list= [{"name": "小蓝", "age": "18"}, {"name": "小红", "age": "18"},  {"name": "小蓝", "age": "18"}]

def DictinList_duplicate(data_list):
    """
    列表套字典去重
    :return:
    """
    seen = set()
    new_l = []
    for d in data_list:
        t = tuple(d.items())
        if t not in seen:
            seen.add(t)
            new_l.append(d)
    print(new_l)
  1. 先创建一个空集合,一个空列表
  2. 循环我们要传进来的列表,
  3. 将其字典的items()转化为元组,作为可哈希类型
  4. 如果集合不存在则添加到集合和空列表中,

 3.方式3:

data_list= [{"name": "小蓝", "age": "18"}, {"name": "小红", "age": "18"},  {"name": "小蓝", "age": "18"}]

new_list = [dict(d) for d in (set([tuple(d.items()) for d in data_list]))]
  1. 先将列表循环去除dict将其转换为元组在放入集合中实现去重,在循环一次将去重后的元组转为字典

  2. 第2种方法用了外部变量和if判断,这种方法用了两次循环,时间复杂度会高

  3.将字典转为tuple类型放入集合中达到去重的效果,在转为列表

 

posted on 2023-03-10 12:04  一先生94  阅读(1179)  评论(0编辑  收藏  举报

导航