python list去重函数_Python中List的去重问题

本文介绍了Python中去除列表重复元素的几种方法,包括使用set、collections.Counter以及手动遍历。针对不可哈希元素的情况,文章指出set方法不适用,并讨论了可哈希性的概念。同时,提出了适用于含有不可哈希元素的列表去重的解决方案。
摘要由CSDN通过智能技术生成

Python中的去重问题,这或许是个简单的问题。

比如一个list:a = [1,3,2,9,5,3,1,5],如何删除重复元素,嗯,有一个高端的方法:

#方法一

a = set(a)

a:1, 2, 3, 5, 9.哇,好高端,事情可没这么简单,观察,a的顺序变的,类型也变了

print a,type(a)

set([1, 2, 3, 5, 9])

a变成了python里面的集合类型,顺序且无重复元素,跟sort的功能有点类似,好用,但是这个上述方法既改变的a的类型又改变了a中元素既有顺序(虽然用类型转换成将a变为list类型。

注意a里面的元素全是数字,如果将a里面有其它元素比如:

a = [1,3,2,9,5,3,1,5,[1,2],[1,2]]

print set(a)

TypeError: unhashable type: ‘list‘

于是发现set这个方法不好使了,原因是a里面出现了不可哈希的元素类型,那何为可哈希元素呢?

python文档里面是这么说的:

An object ishashable if it has a hash value which never changes duringits lifetime (it needs a__hash__() method), and can be compared to other objects (it needs an__eq__() or __cmp__() method). Hashable objects which compare equal must have the same hash value.

意思就是说生存期内存可变的对象不可哈希,像list,dict就是不可哈希的,因为它们是可变对象,tuple和str就是不可变对象,是可哈希的。

因此,这个问题产生的原因在于不能想当然地认为list中的元素都是可哈希的,这并不是一个通用的解决方案

#方法二

再看另一种方法,用函数。

from collections import Counter

a = [1,3,2,9,5,3,1,5]

c = Counter(a)

print c

输了结果为:

Counter({1: 2, 3: 2, 5: 2, 2: 1, 9: 1})

这不错,将a中的每个元素的个数都列举出来了,这样的话只需要根据c元素与之对应的元素个数删除重复元素即可(c的类型为Counter,可以看出跟dict类型相似,用法也是相似的)

c = {k:v-1 for k,v in c.items() if v > 1}#将a中元素个数大于1的元素找出来,v-1表示要删除的重复元素的个数

for k,v in c.items():

for i in range(v):#根据重复次数删除重复元素

a.remove(k)

如此便可达到去重的目的,貌似有点复杂哦。

看到有网友用这个方法:

a = sorted(set(a),key = a.index)

矮小精悍,很不错哦

但是这些方法同样不支持不可哈希对象的操作,因此这个方法也不具有通用性。

#方法三

那只有最笨的方法了

c = {a.count(a[i]):a[i] for i in xrange(len(a))}

然后套用方法二即可,在运用这个方法的过程中,发现dict类型为key:value的形式,其中key的值只能为可哈希元素,又引申出一个新的问题,回头再读一读陈儒写的python源码剖析,呵呵!

未完,待续……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用多种方法对Python列表进行去重。以下是几种常见的方法: 1. 使用for循环和if语句创建一个新的列表,只添加不重复的元素。可以使用一个空列表来存储不重复的元素,然后遍历原始列表,检查每个元素是否已经存在于新列表。如果不存在,则将其添加到新列表。这种方法可以保留原始列表的顺序。例如:\[1\] 2. 使用字典(dict)的键来去重。可以创建一个空字典,然后遍历原始列表,将每个元素作为字典的键,并将其值设置为任意非空值。由于字典的键是唯一的,重复的元素将被自动去重。最后,可以将字典的键转换为列表,以获取去重后的结果。这种方法也可以保留原始列表的顺序。例如:\[2\] 3. 使用集合(set)来去重。可以使用set()函数创建一个无序不重复元素的集合,然后将原始列表作为参数传递给set()函数。集合会自动去除重复的元素。最后,可以将集合转换为列表,以获取去重后的结果。需要注意的是,集合是无序的,所以去重后的列表可能会改变元素的顺序。例如:\[3\] 以上是几种常见的Python列表去重方法,你可以根据具体的需求选择适合的方法。 #### 引用[.reference_title] - *1* *3* [Python 列表(list)去重的几种方式](https://blog.csdn.net/p1306252/article/details/119607065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python对列表list去重的4种实现方法](https://blog.csdn.net/zh6526157/article/details/122516733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值