加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读