Python中list、dict去重

1. 清晰明了版(不改变顺序):

ids = [1,2,3,3,4,2,3,4,5,6,1]
news_ids = []
for id in ids:
    if id not in news_ids:
        news_ids.append(id)
print (news_ids)

 2.  简介快速版

利用set的自动去重功能:

li=[1,2,3,4,5,1,2,3]
li=list(set(li))
print(li)

这样处理会改变list原有顺序,若想保持顺序不变,则如下:

li=[1,2,3,4,5,1,2,3]
new_li=list(set(li))
new_li.sort(key=li.index)
print(new_li)

 3. 匿名函数版

ids = [1,4,3,3,4,2,3,4,5,6,1]
func = lambda x,y:x if y in x else x + [y]
reduce(func, [[], ] + ids)

4. 高级模块版 

import itertools
ids = [1,4,3,3,4,2,3,4,5,6,1]
ids.sort()
it = itertools.groupby(ids)
for k, g in it:
    print (k)

5. 数量级GB左右文本快速去重

#coding=utf-8 
import sys, re, os
def quchong(infile, outfile):
    inopen = open(infile, 'r', encoding='utf-8')
    outopen = open(outfile, 'w', encoding='utf-8')
    data = inopen.read()
    list_1 = list(set(data.split('\n')))
    print(list_1)
    for line in list_1:
        if line != '':
            outopen.write(line + '\n')
    inopen.close()
    outopen.close()

6. 字典针对Value去重:

由于字典要求“键”必须不一致,因此可通过将键值对调换位置进行去重,完成后再换回去即可。

func = lambda z: dict([(x, y) for y, x in z.items()])     # 字典键值对位置互换
result = func(func(tw))

 

<think>嗯,用户想了解在Python中对list进行的方法。首先,我需要回忆常见的方式。记得最简单的可能是用集合,因为集合会自动。例如,把list转成set再转回来,但这样会打乱顺序,如果用户需要保持顺序的话,这种方法就不太适用。那有没有保持顺序的方法呢?对了,可以用遍历的方式,逐个检查元素是否已经在新列表中,没有的话就添加进。这种方法虽然简单,但效率可能不高,尤其是列表很大的时候,因为每次都要检查元素是否存在,时间复杂度是O(n²)。 然后,想到Python 3.7及以上版本字典保持插入顺序的特性,可以用dict.fromkeys()来处理。这样转换后的字典键会自动,并且保持顺序,然后再转回列表。这可能是一个更高效的方法,时间复杂度是O(n)。但需要注意Python版本的问题,如果用户使用的是旧版本,这个方法可能不适用。 另外,用户提到的引用中有几种方法。引用3里提到的是直观方法,也就是遍历检查是否存在于新列表。引用1里的代码用了reduce和lambda函数,但看起来有点复杂,可能效率也不高,因为每次都要检查元素是否在列表中。不过这种方法适用于处理字典列表的,因为字典是不可哈希的,不能直接用集合。这时候可能需要将字典转换成可哈希的结构,比如元组,或者使用其他方法来判断复。 用户的问题是关于list,可能包含各种元素类型。如果是基本数据类型,用集合或字典方法都可以。但如果列表中的元素是字典,就需要特殊处理,比如使用引用1中的方法,或者将每个字典转换成可哈希的形式,比如frozenset或者排序后的元组,然后再。 此外,用户可能需要考虑的条件。比如,是否基于某个键的值,或者整个元素完全一致。对于字典列表,可能需要自定义比较函数。例如,引用1中的例子是要复的字典,但字典本身是可变对象,不能直接作为集合的元素。因此,需要将字典转换成可哈希的结构,或者在遍历时逐个比较。 总结下来,常见的方法包括: 1. 使用集合转换,但会失顺序。 2. 遍历检查,保持顺序但效率低。 3. 利用字典的键唯一性,保持顺序(Python 3.7+)。 4. 针对字典列表的特殊处理,如转换为元组或使用自定义函数。 用户可能需要根据具体的数据类型和需求选择合适的方法。如果列表中有不可哈希的元素,比如字典,就需要使用其他方法。此外,性能也是一个考虑因素,特别是处理大数据量时,应选择时间复杂度较低的方法。 还需要注意用户提供的引用中提到的两种方法,一种是直观遍历法,另一种是使用reduce和lambda函数。可能需要解释这些方法的适用场景和优缺点。例如,reduce方法在处理字典列表时有效,但效率可能不高,因为它每次都要遍历已处理的部分列表。 最后,应该给出示例代码,说明每种方法的实现,并指出它们的优缺点,帮助用户根据实际情况选择最适合的方法。</think>在Python中对列表进行处理有多种实现方式,以下是常见的4种方法及适用场景分析: ### 一、基础数据类型 #### 1. 集合转换法(改变顺序) ```python original_list = [2, 1, 3, 2, 4, 3] unique_list = list(set(original_list)) # 输出:[1, 2, 3, 4] ``` **特点**:时间复杂度$O(n)$,但会丢失原始顺序[^3] #### 2. 字典键法(保持顺序) ```python original_list = [2, 1, 3, 2, 4, 3] unique_list = list(dict.fromkeys(original_list)) # 输出:[2, 1, 3, 4] ``` **特点**:Python 3.7+版本有效,时间复杂度$O(n)$[^3] #### 3. 遍历筛选法 ```python original_list = [2, 1, 3, 2, 4, 3] unique_list = [] for item in original_list: if item not in unique_list: unique_list.append(item) ``` **特点**:时间复杂度$O(n^2)$,适合小规模数据[^3] ### 二、字典列表 #### 1. 序列化判断法 ```python from functools import reduce data = [ {"name": "张三", "height": 172}, {"name": "李四", "height": 165}, {"name": "张三", "height": 172} ] def remove_duplicate(list_dict): return reduce( lambda acc, cur: acc if any(cur.items() == x.items() for x in acc) else acc + [cur], list_dict, [] ) ``` **特点**:通过遍历对比字典键值对实现[^1] #### 2. 哈希值标记法 ```python seen = set() result = [] for d in data: h = frozenset(d.items()) if h not in seen: seen.add(h) result.append(d) ``` **特点**:使用`frozenset`创建可哈希对象,时间复杂度$O(n)$ ### 三、方法对比 | 方法 | 时间复杂度 | 保持顺序 | 适用数据类型 | |--------------------|------------|----------|-----------------------| | 集合转换法 | $O(n)$ | × | 基础类型 | | 字典键法 | $O(n)$ | √ | 可哈希对象(Python3.7+)| | 遍历筛选法 | $O(n^2)$ | √ | 所有类型 | | 序列化判断法 | $O(n^2)$ | √ | 字典列表 | | 哈希值标记法 | $O(n)$ | √ | 字典列表 | ### 四、选择建议 1. 基础数据类型优先选择字典键法 2. 需要兼容旧版本Python时使用遍历筛选法 3. 字典列表推荐使用哈希值标记法 4. 处理JSON数据时可结合序列化方法 $$ \text{时间复杂度计算示例}:T(n) = C_1n + C_2 $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值