Python优化了如何在列表中查找重复值和值索引
发布时间:2020-12-20 12:32:09 所属栏目:Python 来源:网络整理
导读:我有一个包含18 000个唯一ID的列表. ID是字母A,B,C,D的串联. 我已经制作了一个代码,它按ID [0:-1]对ID进行分组,并给出重复ID的索引位置. 这样做效果很好,但进行的时间很长:大约110秒,18 000 ID. 你有想法加快我的代码吗? a = ['1CDABCABDA','1CDABCABDB',
我有一个包含18 000个唯一ID的列表.
ID是字母A,B,C,D的串联. 我已经制作了一个代码,它按ID [0:-1]对ID进行分组,并给出重复ID的索引位置. 这样做效果很好,但进行的时间很长:大约110秒,18 000 ID. a = ['1CDABCABDA','1CDABCABDB','1CDABCABDD','1BCABCCCAA','1DDAABBBBA','1BCABCCCAD'] startTime = time.time() b = [i[0:-1] for i in a] b = list(set(b)) result = range(len(b)) it = 0 for i in result: result[i] = [b[i],[]] for j in xrange(len(a)): if b[i] == a[j][0:-1]: result[i][1].append(j) endTime = time.time() print endTime - startTime,'secs !' 输出: >>> [['1CDABCABD',[0,1,2]],['1DDAABBBB',[4]],['1BCABCCCA',[3,5]]] 解决方法
作为这种问题的更Pythonic方式使用
collections.defaultdict :
>>> from collections import defaultdict >>> d=defaultdict(list) >>> new=[i[:-1] for i in a] >>> d=defaultdict(list) >>> for i,j in enumerate(new): ... d[j].append(i) ... >>> d defaultdict(<type 'list'>,{'1CDABCABD': [0,2],'1DDAABBBB': [4],'1BCABCCCA': [3,5]}) >>> d.items() [('1CDABCABD',2]),('1DDAABBBB',[4]),('1BCABCCCA',5])] 请注意,defaultdict是一个线性解决方案,比itertools.groupby和排序更有效. 你也可以使用dict.setdefault方法: >>> d={} >>> for i,j in enumerate(new): ... d.setdefault(j,[]).append(i) ... >>> d {'1CDABCABD': [0,5]} 有关详细信息,请查看以下基准测试标记,速度快?4倍: s1=""" from itertools import groupby a = ['1CDABCABDA','1BCABCCCAD'] key = lambda i: a[i][:-1] indexes = sorted(range(len(a)),key=key) result = [[x,list(y)] for x,y in groupby(indexes,key=key)] """ s2=""" a = ['1CDABCABDA','1BCABCCCAD'] new=[i[:-1] for i in a] d={} for i,j in enumerate(new): d.setdefault(j,[]).append(i) d.items() """ print ' first: ',timeit(stmt=s1,number=100000) print 'second : ',timeit(stmt=s2,number=100000) 结果: first: 0.949549913406 second : 0.250894069672 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |